To be more precise:
middleware:
{{{
from django.http import JsonResponse, HttpResponse
from django.shortcuts import render
from django.core.exceptions import RequestDataTooBig
class CheckRequest(object):
def __init__(self, get_response):
print('middleware init')
self.get_response = get_response
def __call__(self, request):
print('middleware call')
response = self.get_response(request)
return response
def process_exception(self, request, exception):
print('middleware process exeption', exception)
if isinstance(exception, RequestDataTooBig):
print('CALLED')
return HttpResponse("dummy", content_type="text/plain")
#return JsonResponse({"error":"file is too big"})
}}}
Browser:
"Failed to load response data"
I did some research and found out that if I add one line to
https://github.com/django/django/blob/master/django/http/request.py
(create _body to the object before raise) everything starts work as
supposed - I get correct response in browser.
{{{
@property
def body(self):
if not hasattr(self, '_body'):
if self._read_started:
raise RawPostDataException("You cannot access body after
reading from request's data stream")
self._body = self.read(None) # <------ THIS ONE
# Limit the maximum request data size that will be handled in-
memory.
if (settings.DATA_UPLOAD_MAX_MEMORY_SIZE is not None and
int(self.META.get('CONTENT_LENGTH') or 0) >
settings.DATA_UPLOAD_MAX_MEMORY_SIZE):
raise RequestDataTooBig('Request body exceeded
settings.DATA_UPLOAD_MAX_MEMORY_SIZE.')
try:
self._body = self.read()
except IOError as e:
six.reraise(UnreadablePostError,
UnreadablePostError(*e.args), sys.exc_info()[2])
self._stream = BytesIO(self._body)
return self._body
}}}
I do not think it's a right solution, and I may by totally wrong, but it
seems that either response or request object becomes invalid when this
exception is raised.
I left logs and pics at stackoverflow
http://stackoverflow.com/questions/43496658/django-catch-
requestdatatoobig-exception/43528969#43528969, and can add additional
information if needed.
To make long story short, you can not send valid response if this
exception was raised.
--
Ticket URL: <https://code.djangoproject.com/ticket/28106>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
Old description:
New description:
class CheckRequest(object):
response = self.get_response(request)
return response
# Limit the maximum request data size that will be handled in-
--
--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:1>
* has_patch: 0 => 1
* component: Uncategorized => HTTP handling
--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:2>
* type: Uncategorized => Bug
--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:3>
Old description:
> I have a middleware where I want to catch RequestDataTooBig exeption,
>
> # Limit the maximum request data size that will be handled
> in-memory.
> if (settings.DATA_UPLOAD_MAX_MEMORY_SIZE is not None and
> int(self.META.get('CONTENT_LENGTH') or 0) >
> settings.DATA_UPLOAD_MAX_MEMORY_SIZE):
> self._body = self.read(None) # <------ THIS ONE
> raise RequestDataTooBig('Request body exceeded
> settings.DATA_UPLOAD_MAX_MEMORY_SIZE.')
>
> try:
> self._body = self.read()
> except IOError as e:
> six.reraise(UnreadablePostError,
> UnreadablePostError(*e.args), sys.exc_info()[2])
> self._stream = BytesIO(self._body)
> return self._body
> }}}
>
> I do not think it's a right solution, and I may by totally wrong, but it
> seems that either response or request object becomes invalid when this
> exception is raised.
>
> I left logs and pics at stackoverflow
> http://stackoverflow.com/questions/43496658/django-catch-
> requestdatatoobig-exception/43528969#43528969, and can add additional
> information if needed.
>
> To make long story short, you can not send valid response if this
> exception was raised.
New description:
class CheckRequest(object):
response = self.get_response(request)
return response
# Limit the maximum request data size that will be handled in-
memory.
if (settings.DATA_UPLOAD_MAX_MEMORY_SIZE is not None and
int(self.META.get('CONTENT_LENGTH') or 0) >
settings.DATA_UPLOAD_MAX_MEMORY_SIZE):
self._body = self.read(None) # <------ THIS ONE
raise RequestDataTooBig('Request body exceeded
settings.DATA_UPLOAD_MAX_MEMORY_SIZE.')
try:
self._body = self.read()
except IOError as e:
six.reraise(UnreadablePostError,
UnreadablePostError(*e.args), sys.exc_info()[2])
self._stream = BytesIO(self._body)
return self._body
}}}
It seems that either response or request object becomes invalid when this
exception is raised.
I left logs and pics at stackoverflow
http://stackoverflow.com/questions/43496658/django-catch-
requestdatatoobig-exception/43528969#43528969, and can add additional
information if needed.
To make long story short, you can not send valid response if this
exception was raised.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:4>
* version: 1.10 => master
--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:5>
Comment (by Tim Graham):
I'm not able to reproduce the issue with the information you provided.
Could you provide a sample project or a test for Django's test suite?
--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:6>
* status: new => closed
* resolution: => needsinfo
--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:7>
Comment (by Tim Graham):
#29427 is a duplicate that's been accepted.
--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:8>