From c39853b54fae9ca2a36e56afd7484c346905c0ce Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Wed, 15 Nov 2017 07:53:54 -0800 Subject: [PATCH] Fix erroneous ContentNotRenderedError raised by the redirects panel Panel.process_response() must always return a rendered response. Thanks Hiroki Kiyohara for the report. Fixes #1009 --- debug_toolbar/panels/redirects.py | 1 + docs/changes.rst | 5 +++++ tests/test_integration.py | 11 +++++++++++ tests/urls.py | 2 ++ tests/views.py | 11 ++++++++++- 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/debug_toolbar/panels/redirects.py b/debug_toolbar/panels/redirects.py index ec57bb9fc..01a60167e 100644 --- a/debug_toolbar/panels/redirects.py +++ b/debug_toolbar/panels/redirects.py @@ -25,4 +25,5 @@ def process_response(self, request, response): # Using SimpleTemplateResponse avoids running global context processors. response = SimpleTemplateResponse('debug_toolbar/redirect.html', context) response.cookies = cookies + response.render() return response diff --git a/docs/changes.rst b/docs/changes.rst index 4770696dc..c8e0cbe8a 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -1,6 +1,11 @@ Change log ========== +UNRELEASED +---------- + +* Fix erroneous ``ContentNotRenderedError`` raised by the redirects panel. + 1.9 --- diff --git a/tests/test_integration.py b/tests/test_integration.py index fceb9ae4c..b177bec30 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -227,6 +227,17 @@ def test_data_store_id_not_rendered_when_none(self): self.assertIn(b'id="djDebug"', response.content) self.assertNotIn(b'data-store-id', response.content) + def test_view_returns_template_response(self): + response = self.client.get('/template_response/basic/') + self.assertEqual(response.status_code, 200) + + @override_settings(DEBUG_TOOLBAR_CONFIG={'DISABLE_PANELS': set()}) + def test_incercept_redirects(self): + response = self.client.get('/redirect/') + self.assertEqual(response.status_code, 200) + # Link to LOCATION header. + self.assertIn(b'href="/regular/redirect/"', response.content) + @unittest.skipIf(webdriver is None, "selenium isn't installed") @unittest.skipUnless('DJANGO_SELENIUM_TESTS' in os.environ, "selenium tests not requested") diff --git a/tests/urls.py b/tests/urls.py index 4c377c916..9cee7e501 100644 --- a/tests/urls.py +++ b/tests/urls.py @@ -14,10 +14,12 @@ url(r'^resolving2/(?P.+)/(?P.+)/$', views.resolving_view), url(r'^resolving3/(.+)/$', views.resolving_view, {'arg2': 'default'}), url(r'^regular/(?P.*)/$', views.regular_view), + url(r'^template_response/(?P<title>.*)/$', views.template_response_view), url(r'^regular_jinja/(?P<title>.*)/$', views.regular_jinjia_view), url(r'^non_ascii_request/$', views.regular_view, {'title': NonAsciiRepr()}), url(r'^new_user/$', views.new_user), url(r'^execute_sql/$', views.execute_sql), url(r'^cached_view/$', views.cached_view), + url(r'^redirect/$', views.redirect_view), url(r'^__debug__/', include(debug_toolbar.urls)), ] diff --git a/tests/views.py b/tests/views.py index a6d231436..17f379c80 100644 --- a/tests/views.py +++ b/tests/views.py @@ -3,7 +3,8 @@ from __future__ import absolute_import, unicode_literals from django.contrib.auth.models import User -from django.http import HttpResponse +from django.http import HttpResponse, HttpResponseRedirect +from django.template.response import TemplateResponse from django.shortcuts import render from django.views.decorators.cache import cache_page @@ -17,6 +18,10 @@ def regular_view(request, title): return render(request, 'basic.html', {'title': title}) +def template_response_view(request, title): + return TemplateResponse(request, 'basic.html', {'title': title}) + + def new_user(request, username='joe'): User.objects.create_user(username=username) return render(request, 'basic.html', {'title': 'new user'}) @@ -39,3 +44,7 @@ def regular_jinjia_view(request, title): def listcomp_view(request): lst = [i for i in range(50000) if i % 2 == 0] return render(request, 'basic.html', {'title': 'List comprehension', 'lst': lst}) + + +def redirect_view(request): + return HttpResponseRedirect('/regular/redirect/')