Skip to content

Commit 2c5fae5

Browse files
committed
Add comments in DebugToolbarMiddleware.
Reorder process_response slightly to ensure instrumentation is deactivated for streaming responses.
1 parent 4844136 commit 2c5fae5

File tree

1 file changed

+37
-13
lines changed

1 file changed

+37
-13
lines changed

debug_toolbar/middleware.py

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,27 +39,35 @@ class DebugToolbarMiddleware(object):
3939
debug_toolbars = {}
4040

4141
def process_request(self, request):
42+
# Decide whether the toolbar is active for this request.
4243
func_path = dt_settings.CONFIG['SHOW_TOOLBAR_CALLBACK']
4344
# Replace this with import_by_path in Django >= 1.6.
4445
mod_path, func_name = func_path.rsplit('.', 1)
4546
show_toolbar = getattr(import_module(mod_path), func_name)
4647
if not show_toolbar(request):
4748
return
48-
response = None
49+
4950
toolbar = DebugToolbar(request)
51+
self.__class__.debug_toolbars[threading.current_thread().ident] = toolbar
52+
53+
# Activate instrumentation ie. monkey-patch.
5054
for panel in toolbar.enabled_panels:
5155
panel.enable_instrumentation()
56+
57+
# Run process_request methods of panels like Django middleware.
58+
response = None
5259
for panel in toolbar.enabled_panels:
5360
response = panel.process_request(request)
5461
if response:
5562
break
56-
self.__class__.debug_toolbars[threading.current_thread().ident] = toolbar
5763
return response
5864

5965
def process_view(self, request, view_func, view_args, view_kwargs):
6066
toolbar = self.__class__.debug_toolbars.get(threading.current_thread().ident)
6167
if not toolbar:
6268
return
69+
70+
# Run process_view methods of panels like Django middleware.
6371
response = None
6472
for panel in toolbar.enabled_panels:
6573
response = panel.process_view(request, view_func, view_args, view_kwargs)
@@ -69,26 +77,42 @@ def process_view(self, request, view_func, view_args, view_kwargs):
6977

7078
def process_response(self, request, response):
7179
toolbar = self.__class__.debug_toolbars.pop(threading.current_thread().ident, None)
72-
if not toolbar or getattr(response, 'streaming', False):
80+
if not toolbar:
7381
return response
82+
83+
# Run process_response methods of panels like Django middleware.
7484
for panel in reversed(toolbar.enabled_panels):
7585
new_response = panel.process_response(request, response)
7686
if new_response:
7787
response = new_response
88+
89+
# Deactivate instrumentation ie. monkey-unpatch. This must run
90+
# regardless of the response. Keep 'return' clauses below.
91+
# (NB: Django's model for middleware doesn't guarantee anything.)
7892
for panel in reversed(toolbar.enabled_panels):
7993
panel.disable_instrumentation()
94+
95+
# Check for responses where the toolbar can't be inserted.
96+
content_encoding = response.get('Content-Encoding', '')
97+
content_type = response.get('Content-Type', '').split(';')[0]
98+
if any((getattr(response, 'streaming', False),
99+
'gzip' in content_encoding,
100+
content_type not in _HTML_TYPES)):
101+
return response
102+
103+
# Collapse the toolbar by default if SHOW_COLLAPSED is set.
80104
if toolbar.config['SHOW_COLLAPSED'] and 'djdt' not in request.COOKIES:
81105
response.set_cookie('djdt', 'hide', 864000)
82-
if ('gzip' not in response.get('Content-Encoding', '') and
83-
response.get('Content-Type', '').split(';')[0] in _HTML_TYPES):
84-
content = force_text(response.content, encoding=settings.DEFAULT_CHARSET)
85-
try:
86-
insert_at = content.lower().rindex(dt_settings.CONFIG['INSERT_BEFORE'].lower())
87-
except ValueError:
88-
pass
89-
else:
90-
toolbar_content = toolbar.render_toolbar()
91-
response.content = content[:insert_at] + toolbar_content + content[insert_at:]
106+
107+
# Insert the toolbar in the response.
108+
content = force_text(response.content, encoding=settings.DEFAULT_CHARSET)
109+
try:
110+
insert_at = content.lower().rindex(dt_settings.CONFIG['INSERT_BEFORE'].lower())
111+
except ValueError:
112+
pass
113+
else:
114+
toolbar_content = toolbar.render_toolbar()
115+
response.content = content[:insert_at] + toolbar_content + content[insert_at:]
92116
if response.get('Content-Length', None):
93117
response['Content-Length'] = len(response.content)
94118
return response

0 commit comments

Comments
 (0)