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:
Russell Keith-Magee 2010-03-12 16:45:29 +00:00
parent 4120a181e9
commit 794690c272
2 changed files with 19 additions and 15 deletions

View File

@ -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,12 +81,11 @@ 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(
request.path_info) request.path_info)

View File

@ -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', ))