Исключение TooManyFilesSent

Исключение TooManyFilesSent из модуля django.core.exceptions возникает при обработке запроса, содержащего файлы, когда общее количество переданных файлов превышает значение, установленное в параметре DATA_UPLOAD_MAX_NUMBER_FILES. Это исключение является подклассом SuspiciousOperation и служит для защиты сервера от чрезмерного количества файлов в одном запросе. По умолчанию лимит установлен на значение 100 файлов.

Синтаксис

pythonclass TooManyFilesSent(SuspiciousOperation):
  pass

Пример

Рассмотрим ситуацию, когда клиент отправляет запрос с большим количеством файлов, превышающим лимит:

pythonfrom django.core.exceptions import TooManyFilesSent
from django.http import HttpRequest

# Создаём тестовый запрос с множеством файлов
request = HttpRequest()
request.FILES = {
  f'file_{i}': None for i in range(150)
}

try:
  # Django автоматически проверяет количество файлов
  # при обработке запроса
  if len(request.FILES) > 100:
    raise TooManyFilesSent(
      'Too many files sent in request'
    )
except TooManyFilesSent as e:
  print(str(e))

Результат выполнения кода:

python"Too many files sent in request"

Пример

В реальном приложении это исключение обрабатывается автоматически Django. Можно переопределить лимит в настройках проекта:

python# settings.py
# Устанавливаем максимальное количество файлов в запросе - 50
DATA_UPLOAD_MAX_NUMBER_FILES = 50

# views.py
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
from django.core.exceptions import TooManyFilesSent

@csrf_exempt
def upload_multiple_files(request):
  try:
    # Если файлов больше 50, Django выбросит исключение
    files = request.FILES
    res = {"status": "ok", "files_count": len(files)}
    return JsonResponse(res)
  except TooManyFilesSent:
    res = {"status": "error", "message": "Too many files"}
    return JsonResponse(res, status=400)

Пример

Пример обработки исключения в middleware для централизованной обработки ошибок:

pythonfrom django.core.exceptions import TooManyFilesSent
from django.http import HttpResponse

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

  def __call__(self, request):
    try:
      response = self.get_response(request)
      return response
    except TooManyFilesSent:
      return HttpResponse(
        "Too many files uploaded",
        status=400
      )

Результат выполнения кода при превышении лимита:

python"Too many files uploaded"

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

  • исключение TooManyFieldsSent,
    которое возникает при превышении количества полей в запросе
  • исключение SuspiciousMultipartForm,
    которое возникает при подозрительном multipart запросе
  • исключение RequestDataTooBig,
    которое возникает при превышении размера данных запроса
  • исключение SuspiciousFileOperation,
    которое возникает при подозрительной операции с файлами