Sfoglia il codice sorgente

Fixed #6992 -- Improved error when middleware omits HttpResponse.

Thanks guettli for the report.
Aymeric Augustin 10 anni fa
parent
commit
47a9347b98
2 ha cambiato i file con 56 aggiunte e 0 eliminazioni
  1. 12 0
      django/core/handlers/base.py
  2. 44 0
      tests/middleware_exceptions/tests.py

+ 12 - 0
django/core/handlers/base.py

@@ -134,6 +134,12 @@ class BaseHandler(object):
             if hasattr(response, 'render') and callable(response.render):
                 for middleware_method in self._template_response_middleware:
                     response = middleware_method(request, response)
+                    # Complain if the template response middleware returned None (a common error).
+                    if response is None:
+                        raise ValueError(
+                            "%s.process_template_response didn't return an "
+                            "HttpResponse object. It returned None instead."
+                            % (middleware_method.__self__.__class__.__name__))
                 response = response.render()
 
         except http.Http404 as e:
@@ -202,6 +208,12 @@ class BaseHandler(object):
             # Apply response middleware, regardless of the response
             for middleware_method in self._response_middleware:
                 response = middleware_method(request, response)
+                # Complain if the response middleware returned None (a common error).
+                if response is None:
+                    raise ValueError(
+                        "%s.process_response didn't return an "
+                        "HttpResponse object. It returned None instead."
+                        % (middleware_method.__self__.__class__.__name__))
             response = self.apply_response_fixes(request, response)
         except:  # Any exception should be gathered and handled
             signals.got_request_exception.send(sender=self.__class__, request=request)

+ 44 - 0
tests/middleware_exceptions/tests.py

@@ -101,6 +101,17 @@ class BadExceptionMiddleware(TestMiddleware):
         raise TestException('Test Exception Exception')
 
 
+# Sample middlewares that omit to return an HttpResonse
+class NoTemplateResponseMiddleware(TestMiddleware):
+    def process_template_response(self, request, response):
+        super(NoTemplateResponseMiddleware, self).process_template_response(request, response)
+
+
+class NoResponseMiddleware(TestMiddleware):
+    def process_response(self, request, response):
+        super(NoResponseMiddleware, self).process_response(request, response)
+
+
 @override_settings(ROOT_URLCONF='middleware_exceptions.urls')
 class BaseMiddlewareExceptionTest(TestCase):
 
@@ -775,6 +786,39 @@ class BadMiddlewareTests(BaseMiddlewareExceptionTest):
         self.assert_middleware_usage(bad_middleware, True, True, False, True, True)
         self.assert_middleware_usage(post_middleware, True, True, False, True, True)
 
+    def test_process_response_no_response_middleware(self):
+        pre_middleware = TestMiddleware()
+        middleware = NoResponseMiddleware()
+        post_middleware = TestMiddleware()
+        self._add_middleware(post_middleware)
+        self._add_middleware(middleware)
+        self._add_middleware(pre_middleware)
+        self.assert_exceptions_handled('/middleware_exceptions/view/', [
+            "NoResponseMiddleware.process_response didn't return an HttpResponse object. It returned None instead."
+        ],
+            ValueError())
+
+        # Check that the right middleware methods have been invoked
+        self.assert_middleware_usage(pre_middleware, True, True, False, False, False)
+        self.assert_middleware_usage(middleware, True, True, False, True, False)
+        self.assert_middleware_usage(post_middleware, True, True, False, True, False)
+
+    def test_process_template_response_no_response_middleware(self):
+        pre_middleware = TestMiddleware()
+        middleware = NoTemplateResponseMiddleware()
+        post_middleware = TestMiddleware()
+        self._add_middleware(post_middleware)
+        self._add_middleware(middleware)
+        self._add_middleware(pre_middleware)
+        self.assert_exceptions_handled('/middleware_exceptions/template_response/', [
+            "NoTemplateResponseMiddleware.process_template_response didn't return an HttpResponse object. It returned None instead."
+        ],
+            ValueError())
+
+        # Check that the right middleware methods have been invoked
+        self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
+        self.assert_middleware_usage(middleware, True, True, True, True, False)
+        self.assert_middleware_usage(post_middleware, True, True, True, True, False)
 
 _missing = object()