Fixed #13090 -- Corrected handling of errors in middleware when DEBUG=False. Thanks to EroSennin for the report, and Ivan Sagalaev for the patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12773 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
4120a181e9
commit
794690c272
|
@ -70,10 +70,10 @@ class BaseHandler(object):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
try:
|
try:
|
||||||
# Reset the urlconf for this thread.
|
# Setup default url resolver for this thread.
|
||||||
urlresolvers.set_urlconf(None)
|
urlconf = settings.ROOT_URLCONF
|
||||||
# Obtain a default resolver. It's needed early for handling 404's.
|
urlresolvers.set_urlconf(urlconf)
|
||||||
resolver = urlresolvers.RegexURLResolver(r'^/', None)
|
resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
|
||||||
|
|
||||||
# Apply request middleware
|
# Apply request middleware
|
||||||
for middleware_method in self._request_middleware:
|
for middleware_method in self._request_middleware:
|
||||||
|
@ -81,11 +81,10 @@ class BaseHandler(object):
|
||||||
if response:
|
if response:
|
||||||
return response
|
return response
|
||||||
|
|
||||||
# Get urlconf from request object, if available. Otherwise use default.
|
if hasattr(request, "urlconf"):
|
||||||
urlconf = getattr(request, "urlconf", settings.ROOT_URLCONF)
|
# Reset url resolver with a custom urlconf.
|
||||||
# Set the urlconf for this thread to the one specified above.
|
urlconf = request.urlconf
|
||||||
urlresolvers.set_urlconf(urlconf)
|
urlresolvers.set_urlconf(urlconf)
|
||||||
# Reset the resolver with a possibly new urlconf
|
|
||||||
resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
|
resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
|
||||||
|
|
||||||
callback, callback_args, callback_kwargs = resolver.resolve(
|
callback, callback_args, callback_kwargs = resolver.resolve(
|
||||||
|
|
|
@ -3,9 +3,12 @@ import sys
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.core.signals import got_request_exception
|
from django.core.signals import got_request_exception
|
||||||
|
|
||||||
class RequestMiddleware(object):
|
class TestException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TestMiddleware(object):
|
||||||
def process_request(self, request):
|
def process_request(self, request):
|
||||||
raise Exception('Exception')
|
raise TestException('Test Exception')
|
||||||
|
|
||||||
class MiddlewareExceptionTest(TestCase):
|
class MiddlewareExceptionTest(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -21,15 +24,17 @@ class MiddlewareExceptionTest(TestCase):
|
||||||
self.exceptions.append(sys.exc_info())
|
self.exceptions.append(sys.exc_info())
|
||||||
|
|
||||||
def test_process_request(self):
|
def test_process_request(self):
|
||||||
self.client.handler._request_middleware.insert(0, RequestMiddleware().process_request)
|
self.client.handler._request_middleware.insert(0, TestMiddleware().process_request)
|
||||||
try:
|
try:
|
||||||
response = self.client.get('/')
|
response = self.client.get('/')
|
||||||
except:
|
except TestException, e:
|
||||||
# Test client indefinitely re-raises any exceptions being raised
|
# Test client indefinitely re-raises any exceptions being raised
|
||||||
# during request handling. Hence actual testing that exception was
|
# during request handling. Hence actual testing that exception was
|
||||||
# properly handled is done by relying on got_request_exception
|
# properly handled is done by relying on got_request_exception
|
||||||
# signal being sent.
|
# signal being sent.
|
||||||
pass
|
pass
|
||||||
|
except Exception, e:
|
||||||
|
self.fail("Unexpected exception: %s" % e)
|
||||||
self.assertEquals(len(self.exceptions), 1)
|
self.assertEquals(len(self.exceptions), 1)
|
||||||
exception, value, tb = self.exceptions[0]
|
exception, value, tb = self.exceptions[0]
|
||||||
self.assertEquals(value.args, ('Exception', ))
|
self.assertEquals(value.args, ('Test Exception', ))
|
||||||
|
|
Loading…
Reference in New Issue