Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Improve debug error handling
  • Loading branch information
lovelydinosaur committed Aug 18, 2016
commit 5f2fb69703faeb76c9ea32eea018acedb59f9dba
6 changes: 6 additions & 0 deletions rest_framework/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ def __init__(self, request, parsers=None, authenticators=None,
self._full_data = Empty
self._content_type = Empty
self._stream = Empty
self.debug_plaintext_traceback = None

if self.parser_context is None:
self.parser_context = {}
Expand Down Expand Up @@ -391,3 +392,8 @@ def QUERY_PARAMS(self):
'`request.QUERY_PARAMS` has been deprecated in favor of `request.query_params` '
'since version 3.0, and has been fully removed as of version 3.2.'
)

def force_plaintext_errors(self, value):
# Hack to allow our exception handler to force choice of
# plaintext or html error responses.
self._request.is_ajax = lambda: value
19 changes: 9 additions & 10 deletions rest_framework/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,14 @@
"""
from __future__ import unicode_literals

import sys

from django.conf import settings
from django.core.exceptions import PermissionDenied
from django.db import models
from django.http import Http404
from django.http.response import HttpResponse, HttpResponseBase
from django.http.response import HttpResponseBase
from django.utils import six
from django.utils.encoding import smart_text
from django.utils.translation import ugettext_lazy as _
from django.views import debug
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import View

Expand Down Expand Up @@ -95,11 +92,6 @@ def exception_handler(exc, context):
set_rollback()
return Response(data, status=status.HTTP_403_FORBIDDEN)

# throw django's error page if debug is True
if settings.DEBUG:
exception_reporter = debug.ExceptionReporter(context.get('request'), *sys.exc_info())
return HttpResponse(exception_reporter.get_traceback_html(), status=500)

return None


Expand Down Expand Up @@ -439,11 +431,18 @@ def handle_exception(self, exc):
response = exception_handler(exc, context)

if response is None:
raise
self.raise_uncaught_exception(exc)

response.exception = True
return response

def raise_uncaught_exception(self, exc):
if settings.DEBUG:
renderer = self.request.accepted_renderer
use_plaintext_traceback = getattr(renderer, 'format') not in ('html', 'api')
self.request.force_plaintext_errors(use_plaintext_traceback)
raise

# Note: Views are made CSRF exempt from within `as_view` as to prevent
# accidental removal of this exemption in cases where `dispatch` needs to
# be overridden.
Expand Down