Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Browse files

Fixed #21668 -- Return detailed error page when SuspiciousOperation i…

…s raised and DEBUG=True

Thanks GDorn and gox21 for report.

Thanks Tim Graham for idea and review.
  • Loading branch information...
1 parent 150d88c commit dbbcfca476e29354c3a5c6221112b55741babc14 @coder9042 coder9042 committed with timgraham
2  django/core/handlers/
@@ -183,6 +183,8 @@ def get_response(self, request):
'status_code': 400,
'request': request
+ if settings.DEBUG:
+ return debug.technical_500_response(request, *sys.exc_info(), status_code=400)
response = self.get_exception_response(request, resolver, 400)
14 django/views/
@@ -7,8 +7,8 @@
import types
from django.conf import settings
-from django.http import (HttpResponse, HttpResponseServerError,
- HttpResponseNotFound, HttpRequest, build_request_repr)
+from django.http import (HttpResponse, HttpResponseNotFound, HttpRequest,
+ build_request_repr)
from django.template import Template, Context, TemplateDoesNotExist
from django.template.defaultfilters import force_escape, pprint
from django.utils.datastructures import MultiValueDict
@@ -65,7 +65,7 @@ def get_safe_settings():
return settings_dict
-def technical_500_response(request, exc_type, exc_value, tb):
+def technical_500_response(request, exc_type, exc_value, tb, status_code=500):
Create a technical server error response. The last three arguments are
the values returned from sys.exc_info() and friends.
@@ -73,10 +73,10 @@ def technical_500_response(request, exc_type, exc_value, tb):
reporter = ExceptionReporter(request, exc_type, exc_value, tb)
if request.is_ajax():
text = reporter.get_traceback_text()
- return HttpResponseServerError(text, content_type='text/plain')
+ return HttpResponse(text, status=status_code, content_type='text/plain')
html = reporter.get_traceback_html()
- return HttpResponseServerError(html, content_type='text/html')
+ return HttpResponse(html, status=status_code, content_type='text/html')
# Cache for the default exception reporter filter instance.
default_exception_reporter_filter = None
@@ -987,7 +987,7 @@ def default_urlconf(request):
You're seeing this error because you have <code>DEBUG = True</code> in your
Django settings file. Change that to <code>False</code>, and Django will
- display a standard 500 page.
+ display a standard page generated by the handler for this status code.
{% endif %}
@@ -1053,7 +1053,7 @@ def default_urlconf(request):
You're seeing this error because you have DEBUG = True in your
Django settings file. Change that to False, and Django will
-display a standard 500 page.
+display a standard page generated by the handler for this status code.
4 docs/releases/1.8.txt
@@ -211,6 +211,10 @@ Requests and Responses
<django.http.HttpRequest.build_absolute_uri>` method now handles paths
starting with ``//`` correctly.
+* If :setting:`DEBUG` is ``True`` and a request raises a
+ :exc:`~django.core.exceptions.SuspiciousOperation`, the response will be
+ rendered with a detailed error page.
5 tests/view_tests/tests/
@@ -44,6 +44,11 @@ def test_files(self):
self.assertContains(response, 'file_data.txt', status_code=500)
self.assertNotContains(response, 'haha', status_code=500)
+ def test_400(self):
+ # Ensure that when DEBUG=True, technical_500_template() is called.
+ response = self.client.get('/raises400/')
+ self.assertContains(response, '<div class="context" id="', status_code=400)
def test_403(self):
# Ensure no 403.html template exists to test the default case.
with override_with_test_loader({}):

0 comments on commit dbbcfca

Please sign in to comment.
Something went wrong with that request. Please try again.