Permalink
Browse files

Fixed #15083 -- Corrected the order of TemplateResponse middleware ha…

…ndling, ensuring that custom URLConfs are valid, and that ResponseMiddleware is invoked if the TemplateResponseMiddleware causes errors. Thanks to Sayane for the report.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15226 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
1 parent 4d654c9 commit f89f1c8acbf5f9d13d52855c49bef53360b1a6e2 @freakboy3742 freakboy3742 committed Jan 16, 2011
@@ -128,6 +128,13 @@ def get_response(self, request):
view_name = callback.__class__.__name__ + '.__call__' # If it's a class
raise ValueError("The view %s.%s didn't return an HttpResponse object." % (callback.__module__, view_name))
+ # If the response supports deferred rendering, apply template
+ # response middleware and the render the response
+ if hasattr(response, 'render') and callable(response.render):
+ for middleware_method in self._template_response_middleware:
+ response = middleware_method(request, response)
+ response.render()
+
except http.Http404, e:
logger.warning('Not Found: %s' % request.path,
extra={
@@ -166,13 +173,6 @@ def get_response(self, request):
urlresolvers.set_urlconf(None)
try:
- # If the response supports deferred rendering, apply template
- # response middleware and the render the response
- if hasattr(response, 'render') and callable(response.render):
- for middleware_method in self._template_response_middleware:
- response = middleware_method(request, response)
- response.render()
-
# Apply response middleware, regardless of the response
for middleware_method in self._response_middleware:
response = middleware_method(request, response)
@@ -503,9 +503,9 @@ def test_process_template_response_bad_middleware(self):
self.assert_exceptions_handled('/middleware_exceptions/template_response/', ['Test Template Response Exception'])
# Check that the right middleware methods have been invoked
- self.assert_middleware_usage(pre_middleware, True, True, False, False, False)
- self.assert_middleware_usage(bad_middleware, True, True, True, False, False)
- self.assert_middleware_usage(post_middleware, True, True, True, False, False)
+ self.assert_middleware_usage(pre_middleware, True, True, False, True, False)
+ self.assert_middleware_usage(bad_middleware, True, True, True, True, False)
+ self.assert_middleware_usage(post_middleware, True, True, True, True, False)
def test_process_response_bad_middleware(self):
pre_middleware = TestMiddleware()
@@ -0,0 +1,11 @@
+# coding: utf-8
+from django.conf.urls.defaults import *
+from regressiontests.templates import views
+
+urlpatterns = patterns('',
+ # View returning a template response
+ (r'^template_response_view/', views.template_response_view),
+
+ # A view that can be hard to find...
+ url(r'^snark/', views.snark, name='snark'),
+)
@@ -1,6 +1,6 @@
import os
from django.utils import unittest
-from django.test import RequestFactory
+from django.test import RequestFactory, TestCase
from django.conf import settings
import django.template.context
from django.template import Template, Context, RequestContext
@@ -11,6 +11,13 @@ def test_processor(request):
return {'processors': 'yes'}
test_processor_name = 'regressiontests.templates.response.test_processor'
+
+# A test middleware that installs a temporary URLConf
+class CustomURLConfMiddleware(object):
+ def process_request(self, request):
+ request.urlconf = 'regressiontests.templates.alternate_urls'
+
+
class BaseTemplateResponseTest(unittest.TestCase):
# tests rely on fact that global context
# processors should only work when RequestContext is used.
@@ -179,3 +186,23 @@ def test_custom_app(self):
rc = response.resolve_context(response.context_data)
self.assertEqual(rc.current_app, 'foobar')
+
+
+class CustomURLConfTest(TestCase):
+ urls = 'regressiontests.templates.urls'
+
+ def setUp(self):
+ self.old_MIDDLEWARE_CLASSES = settings.MIDDLEWARE_CLASSES
+ settings.MIDDLEWARE_CLASSES = list(settings.MIDDLEWARE_CLASSES) + [
+ 'regressiontests.templates.response.CustomURLConfMiddleware'
+ ]
+
+ def tearDown(self):
+ settings.MIDDLEWARE_CLASSES = self.old_MIDDLEWARE_CLASSES
+
+ def test_custom_urlconf(self):
+ response = self.client.get('/template_response_view/')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.content, 'This is where you can find the snark: /snark/')
+
+
@@ -0,0 +1 @@
+{% load url from future %}This is where you can find the snark: {% url "snark" %}
@@ -1,4 +1,7 @@
# Fake views for testing url reverse lookup
+from django.http import HttpResponse
+from django.template.response import TemplateResponse
+
def index(request):
pass
@@ -11,3 +14,9 @@ def client_action(request, id, action):
def client2(request, tag):
pass
+
+def template_response_view(request):
+ return TemplateResponse(request, 'response.html', {})
+
+def snark(request):
+ return HttpResponse('Found him!')

0 comments on commit f89f1c8

Please sign in to comment.