Skip to content

Commit 382ea77

Browse files
authored
Improve debug error handling (#4416)
1 parent b76984d commit 382ea77

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

rest_framework/request.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,3 +391,8 @@ def QUERY_PARAMS(self):
391391
'`request.QUERY_PARAMS` has been deprecated in favor of `request.query_params` '
392392
'since version 3.0, and has been fully removed as of version 3.2.'
393393
)
394+
395+
def force_plaintext_errors(self, value):
396+
# Hack to allow our exception handler to force choice of
397+
# plaintext or html error responses.
398+
self._request.is_ajax = lambda: value

rest_framework/views.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,14 @@
33
"""
44
from __future__ import unicode_literals
55

6-
import sys
7-
86
from django.conf import settings
97
from django.core.exceptions import PermissionDenied
108
from django.db import models
119
from django.http import Http404
12-
from django.http.response import HttpResponse, HttpResponseBase
10+
from django.http.response import HttpResponseBase
1311
from django.utils import six
1412
from django.utils.encoding import smart_text
1513
from django.utils.translation import ugettext_lazy as _
16-
from django.views import debug
1714
from django.views.decorators.csrf import csrf_exempt
1815
from django.views.generic import View
1916

@@ -95,11 +92,6 @@ def exception_handler(exc, context):
9592
set_rollback()
9693
return Response(data, status=status.HTTP_403_FORBIDDEN)
9794

98-
# throw django's error page if debug is True
99-
if settings.DEBUG:
100-
exception_reporter = debug.ExceptionReporter(context.get('request'), *sys.exc_info())
101-
return HttpResponse(exception_reporter.get_traceback_html(), status=500)
102-
10395
return None
10496

10597

@@ -439,11 +431,19 @@ def handle_exception(self, exc):
439431
response = exception_handler(exc, context)
440432

441433
if response is None:
442-
raise
434+
self.raise_uncaught_exception(exc)
443435

444436
response.exception = True
445437
return response
446438

439+
def raise_uncaught_exception(self, exc):
440+
if settings.DEBUG:
441+
request = self.request
442+
renderer_format = getattr(request.accepted_renderer, 'format')
443+
use_plaintext_traceback = renderer_format not in ('html', 'api', 'admin')
444+
request.force_plaintext_errors(use_plaintext_traceback)
445+
raise
446+
447447
# Note: Views are made CSRF exempt from within `as_view` as to prevent
448448
# accidental removal of this exemption in cases where `dispatch` needs to
449449
# be overridden.

0 commit comments

Comments
 (0)