Description
I tried newest django-debug-toolbar, 1.9.
And when I enabled Intercept Redirects and accessed a view returns 302, It returned ContentNotRenderedError
:
ContentNotRenderedError at /admin/
The response content must be rendered before it can be accessed.
Request Method: GET
Request URL: http://127.0.0.1:8000/admin/
Django Version: 1.11.7
Exception Type: ContentNotRenderedError
Exception Value:
The response content must be rendered before it can be accessed.
Exception Location: /tmp/venv/lib/python3.6/site-packages/django/template/response.py in content, line 129
Python Executable: /tmp/venv/bin/python
Python Version: 3.6.3
Python Path:
['/tmp/myproj',
'/usr/lib/python36.zip',
'/usr/lib/python3.6',
'/usr/lib/python3.6/lib-dynload',
'/tmp/venv/lib/python3.6/site-packages']
Server time: Wed, 15 Nov 2017 11:17:34 +0000
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/admin/
Django Version: 1.11.7
Python Version: 3.6.3
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'debug_toolbar']
Installed Middleware:
['debug_toolbar.middleware.DebugToolbarMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "/tmp/venv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
41. response = get_response(request)
File "/tmp/venv/lib/python3.6/site-packages/django/utils/deprecation.py" in __call__
142. response = self.process_response(request, response)
File "/tmp/venv/lib/python3.6/site-packages/debug_toolbar/middleware.py" in process_response
125. content = force_text(response.content, encoding=response.charset)
File "/tmp/venv/lib/python3.6/site-packages/django/template/response.py" in content
129. 'The response content must be rendered before it can be accessed.'
Exception Type: ContentNotRenderedError at /admin/
Exception Value: The response content must be rendered before it can be accessed.
Reason
This error caused by content = force_text(response.content, encoding=response.charset)
, accessing response.content
.
In this case the response
was returned by RedirectsPanel
.
https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/panels/redirects.py#L9
The panel returns SimpleTemplateResponse
object. this class will raise ContentNotRenderedError
when response.content
was accessed before calling response.render()
.
like content = force_text(response.content, ...)
.
This error wasn't on django-debug-toolbar 1.8.
And I think this change caused it
c369384
Fix idea
Simply, we can avoid this error by adding response.render()
in RedirectsPanel
,
folloing here https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/panels/redirects.py#L27
like this.
# Using SimpleTemplateResponse avoids running global context processors.
response = SimpleTemplateResponse('debug_toolbar/redirect.html', context)
response.cookies = cookies
response.render()
Or any other nice plan? (or this issue was not correct?)
I don't know well about codes of django-debug-toolbar, so I didn't create PR yet.
Please ask and tell me anything.