Исключение RequestDataTooBig

Исключение RequestDataTooBig наследуется от SuspiciousOperation и возникает, когда размер данных, переданных в запросе (например, содержимое POST-запроса или загруженные файлы), превышает установленный в настройках Django лимит. Это исключение служит для защиты сервера от потенциальных атак, связанных с переполнением памяти или DoS-атак через отправку чрезмерно больших объемов данных. По умолчанию Django устанавливает ограничение на размер запроса в 2.5 МБ для обычных данных и 2.5 МБ для загружаемых файлов.

Синтаксис

pythonfrom django.core.exceptions import RequestDataTooBig

raise RequestDataTooBig("Размер данных превышает допустимый лимит")

Настройка лимитов в Django

Лимиты на размер запроса настраиваются через параметры в файле настроек settings.py:

python# settings.py

# Максимальный размер данных запроса (в байтах)
DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440  # 2.5 MB

# Максимальный размер загружаемого файла (в байтах)
FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440  # 2.5 MB

# Максимальное количество полей в запросе
DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000

Пример

Создадим модель для загрузки изображений и обработаем возможное исключение RequestDataTooBig:

pythonfrom django.db import models

class ImageUpload(models.Model):
  title = models.CharField(max_length=100)
  image = models.FileField(upload_to='images/')
  uploaded_at = models.DateTimeField(auto_now_add=True)

  def __str__(self):
    return self.title

Пример

Обработка исключения во view-функции при загрузке большого файла:

pythonfrom django.core.exceptions import RequestDataTooBig
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from .models import ImageUpload

@csrf_exempt
def upload_image(request):
  if request.method == 'POST':
    try:
      file = request.FILES['image']
      title = request.POST.get('title', 'Untitled')

      # Проверка размера файла вручную
      if file.size > 5 * 1024 * 1024:  # 5 MB
        return JsonResponse({
          'error': 'File too large',
          'message': 'Максимальный размер файла - 5 МБ'
        }, status=400)

      upload = ImageUpload.objects.create(
        title=title,
        image=file
      )

      return JsonResponse({
        'success': True,
        'id': upload.id,
        'title': upload.title
      })

    except RequestDataTooBig as e:
      # Обработка превышения лимита
      return JsonResponse({
        'error': 'Request too large',
        'message': str(e)
      }, status=413)

  return JsonResponse({'error': 'Method not allowed'}, status=405)

Пример

Глобальная обработка исключения через middleware для централизованного управления ошибками:

pythonfrom django.core.exceptions import RequestDataTooBig
from django.http import JsonResponse

class RequestSizeLimitMiddleware:
  def __init__(self, get_response):
    self.get_response = get_response

  def __call__(self, request):
    response = self.get_response(request)
    return response

  def process_exception(self, request, exception):
    if isinstance(exception, RequestDataTooBig):
      return JsonResponse({
        'error': 'Request Data Too Big',
        'message': 'Превышен лимит размера запроса'
      }, status=413)
    return None

Пример

Увеличение лимитов для конкретного вида запросов с использованием декоратора:

pythonfrom django.core.exceptions import RequestDataTooBig
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
import json

@csrf_exempt
def large_data_view(request):
  if request.method == 'POST':
    try:
      # Проверяем размер тела запроса
      if len(request.body) > 10 * 1024 * 1024:  # 10 MB
        raise RequestDataTooBig(
          'Размер запроса превышает 10 МБ'
        )

      data = json.loads(request.body)
      # Обработка данных
      return HttpResponse(
        f'Обработано {len(data)} записей',
        status=200
      )

    except RequestDataTooBig as e:
      return HttpResponse(
        f'Ошибка: {str(e)}',
        status=413
      )
    except json.JSONDecodeError:
      return HttpResponse(
        'Неверный JSON формат',
        status=400
      )

  return HttpResponse('Метод не поддерживается', status=405)

Смотрите также

  • исключение SuspiciousOperation,
    базовое исключение для подозрительных операций
  • исключение TooManyFieldsSent,
    возникает при превышении лимита полей в запросе
  • исключение TooManyFilesSent,
    возникает при превышении лимита файлов в запросе
  • исключение RequestAborted,
    возникает при прерывании запроса клиентом