Loading django/views/debug.py +4 −2 Original line number Diff line number Diff line Loading @@ -409,7 +409,7 @@ class ExceptionReporter(object): # sometimes in Python 3), take the traceback from self.tb (Python 2 # doesn't have a __traceback__ attribute on Exception) exc_value = exceptions.pop() tb = self.tb if not exceptions else exc_value.__traceback__ tb = self.tb if six.PY2 or not exceptions else exc_value.__traceback__ while tb is not None: # Support for __traceback_hide__ which is used by a few libraries Loading Loading @@ -444,7 +444,9 @@ class ExceptionReporter(object): # If the traceback for current exception is consumed, try the # other exception. if not tb.tb_next and exceptions: if six.PY2: tb = tb.tb_next elif not tb.tb_next and exceptions: exc_value = exceptions.pop() tb = exc_value.__traceback__ else: Loading tests/view_tests/tests/test_debug.py +24 −1 Original line number Diff line number Diff line Loading @@ -14,13 +14,16 @@ from unittest import skipIf from django.core import mail from django.core.files.uploadedfile import SimpleUploadedFile from django.core.urlresolvers import reverse from django.db import DatabaseError, connection from django.template import TemplateDoesNotExist from django.test import RequestFactory, SimpleTestCase, override_settings from django.test.utils import LoggingCaptureMixin from django.utils import six from django.utils.encoding import force_bytes, force_text from django.utils.functional import SimpleLazyObject from django.views.debug import CallableSettingWrapper, ExceptionReporter from django.views.debug import ( CallableSettingWrapper, ExceptionReporter, technical_500_response, ) from .. import BrokenException, except_args from ..views import ( Loading Loading @@ -194,6 +197,26 @@ class DebugViewTests(LoggingCaptureMixin, SimpleTestCase): ) class DebugViewQueriesAllowedTests(SimpleTestCase): # May need a query to initialize MySQL connection allow_database_queries = True def test_handle_db_exception(self): """ Ensure the debug view works when a database exception is raised by performing an invalid query and passing the exception to the debug view. """ with connection.cursor() as cursor: try: cursor.execute('INVALID SQL') except DatabaseError: exc_info = sys.exc_info() rf = RequestFactory() response = technical_500_response(rf.get('/'), *exc_info) self.assertContains(response, 'OperationalError at /', status_code=500) @override_settings( DEBUG=True, ROOT_URLCONF="view_tests.urls", Loading Loading
django/views/debug.py +4 −2 Original line number Diff line number Diff line Loading @@ -409,7 +409,7 @@ class ExceptionReporter(object): # sometimes in Python 3), take the traceback from self.tb (Python 2 # doesn't have a __traceback__ attribute on Exception) exc_value = exceptions.pop() tb = self.tb if not exceptions else exc_value.__traceback__ tb = self.tb if six.PY2 or not exceptions else exc_value.__traceback__ while tb is not None: # Support for __traceback_hide__ which is used by a few libraries Loading Loading @@ -444,7 +444,9 @@ class ExceptionReporter(object): # If the traceback for current exception is consumed, try the # other exception. if not tb.tb_next and exceptions: if six.PY2: tb = tb.tb_next elif not tb.tb_next and exceptions: exc_value = exceptions.pop() tb = exc_value.__traceback__ else: Loading
tests/view_tests/tests/test_debug.py +24 −1 Original line number Diff line number Diff line Loading @@ -14,13 +14,16 @@ from unittest import skipIf from django.core import mail from django.core.files.uploadedfile import SimpleUploadedFile from django.core.urlresolvers import reverse from django.db import DatabaseError, connection from django.template import TemplateDoesNotExist from django.test import RequestFactory, SimpleTestCase, override_settings from django.test.utils import LoggingCaptureMixin from django.utils import six from django.utils.encoding import force_bytes, force_text from django.utils.functional import SimpleLazyObject from django.views.debug import CallableSettingWrapper, ExceptionReporter from django.views.debug import ( CallableSettingWrapper, ExceptionReporter, technical_500_response, ) from .. import BrokenException, except_args from ..views import ( Loading Loading @@ -194,6 +197,26 @@ class DebugViewTests(LoggingCaptureMixin, SimpleTestCase): ) class DebugViewQueriesAllowedTests(SimpleTestCase): # May need a query to initialize MySQL connection allow_database_queries = True def test_handle_db_exception(self): """ Ensure the debug view works when a database exception is raised by performing an invalid query and passing the exception to the debug view. """ with connection.cursor() as cursor: try: cursor.execute('INVALID SQL') except DatabaseError: exc_info = sys.exc_info() rf = RequestFactory() response = technical_500_response(rf.get('/'), *exc_info) self.assertContains(response, 'OperationalError at /', status_code=500) @override_settings( DEBUG=True, ROOT_URLCONF="view_tests.urls", Loading