瀏覽代碼

Fixed #13684 -- if settings.ROOT_URLCONF isn't defined don't blow up with an UnboundLocalError.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14488 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Alex Gaynor 14 年之前
父節點
當前提交
96cc7baf0c
共有 2 個文件被更改,包括 25 次插入7 次删除
  1. 7 6
      django/core/handlers/base.py
  2. 18 1
      tests/regressiontests/middleware_exceptions/tests.py

+ 7 - 6
django/core/handlers/base.py

@@ -73,13 +73,15 @@ class BaseHandler(object):
         from django.conf import settings
 
         try:
+            # Setup default url resolver for this thread, this code is outside
+            # the try/except so we don't get a spurious "unbound local
+            # variable" exception in the event an exception is raised before
+            # resolver is set
+            urlconf = settings.ROOT_URLCONF
+            urlresolvers.set_urlconf(urlconf)
+            resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
             try:
-                # Setup default url resolver for this thread.
-                urlconf = settings.ROOT_URLCONF
-                urlresolvers.set_urlconf(urlconf)
-                resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
                 response = None
-
                 # Apply request middleware
                 for middleware_method in self._request_middleware:
                     response = middleware_method(request)
@@ -239,4 +241,3 @@ def get_script_name(environ):
     if script_url:
         return force_unicode(script_url[:-len(environ.get('PATH_INFO', ''))])
     return force_unicode(environ.get('SCRIPT_NAME', u''))
-

+ 18 - 1
tests/regressiontests/middleware_exceptions/tests.py

@@ -1,8 +1,9 @@
 import sys
 
-from django.test import TestCase
+from django.conf import settings
 from django.core.signals import got_request_exception
 from django.http import HttpResponse
+from django.test import TestCase
 
 
 class TestException(Exception):
@@ -694,3 +695,19 @@ class BadMiddlewareTests(BaseMiddlewareExceptionTest):
         self.assert_middleware_usage(pre_middleware,  True,  True,  True, False)
         self.assert_middleware_usage(bad_middleware,  True,  True,  True,  True)
         self.assert_middleware_usage(post_middleware, True,  True,  True,  True)
+
+
+_missing = object()
+class RootUrlconfTests(TestCase):
+    def test_missing_root_urlconf(self):
+        try:
+            original_ROOT_URLCONF = settings.ROOT_URLCONF
+            del settings.ROOT_URLCONF
+        except AttributeError:
+            original_ROOT_URLCONF = _missing
+        self.assertRaises(AttributeError,
+            self.client.get, "/middleware_exceptions/view/"
+        )
+
+        if original_ROOT_URLCONF is not _missing:
+            settings.ROOT_URLCONF = original_ROOT_URLCONF