Исключение RequestDataTooBig
Исключение RequestDataTooBig наследуется от SuspiciousOperation и
возникает, когда размер данных, переданных в запросе (например, содержимое
POST-запроса или загруженные файлы), превышает установленный в настройках
Django лимит. Это исключение служит для защиты сервера от потенциальных
атак, связанных с переполнением памяти или DoS-атак через отправку
чрезмерно больших объемов данных. По умолчанию Django устанавливает
ограничение на размер запроса в 2.5 МБ для обычных данных и 2.5 МБ для
загружаемых файлов.
Синтаксис
from django.core.exceptions import RequestDataTooBig
raise RequestDataTooBig("Размер данных превышает допустимый лимит")
Настройка лимитов в Django
Лимиты на размер запроса настраиваются через параметры в файле настроек
settings.py:
# 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:
from 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-функции при загрузке большого файла:
from 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 для централизованного управления ошибками:
from 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
Пример
Увеличение лимитов для конкретного вида запросов с использованием декоратора:
from 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,
возникает при прерывании запроса клиентом