Skip to content

Commit 1afcb96

Browse files
committed
Warn the user when the gzip middleware is imported before the toolbar.
1 parent d9d8e3a commit 1afcb96

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

debug_toolbar/apps.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ class DebugToolbarConfig(AppConfig):
1313
def ready(self):
1414
if dt_settings.PATCH_SETTINGS:
1515
dt_settings.patch_all()
16+
dt_settings.check_middleware()

debug_toolbar/settings.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,28 +153,48 @@
153153
'debug_toolbar.panels.redirects.RedirectsPanel'
154154
)
155155

156-
157156
PATCH_SETTINGS = getattr(settings, 'DEBUG_TOOLBAR_PATCH_SETTINGS', settings.DEBUG)
158157

159158

160159
# The following functions can monkey-patch settings automatically. Several
161160
# imports are placed inside functions to make it safe to import this module.
162161

163162

164-
def is_toolbar_middleware(middleware_path):
163+
def check_middleware():
164+
from django.middleware.gzip import GZipMiddleware
165165
from debug_toolbar.middleware import DebugToolbarMiddleware
166+
gzip_index = None
167+
debug_toolbar_index = None
168+
169+
# Determine the indexes which gzip and/or the toolbar are installed at
170+
for i, middleware in enumerate(settings.MIDDLEWARE_CLASSES):
171+
if is_middleware_class(GZipMiddleware, middleware):
172+
gzip_index = i
173+
elif is_middleware_class(DebugToolbarMiddleware, middleware):
174+
debug_toolbar_index = i
175+
# If the toolbar appears before the gzip index, raise a warning
176+
if gzip_index is not None and debug_toolbar_index < gzip_index:
177+
warnings.warn(
178+
"Please use an explicit setup with the "
179+
"debug_toolbar.middleware.DebugToolbarMiddleware "
180+
"after django.middleware.gzip.GZipMiddlware "
181+
"in MIDDLEWARE_CLASSES.", Warning)
182+
183+
184+
def is_middleware_class(middleware_class, middleware_path):
166185
# This could be replaced by import_by_path in Django >= 1.6.
167186
try:
168187
mod_path, cls_name = middleware_path.rsplit('.', 1)
169188
mod = import_module(mod_path)
170189
middleware_cls = getattr(mod, cls_name)
171190
except (AttributeError, ImportError, ValueError):
172191
return
173-
return issubclass(middleware_cls, DebugToolbarMiddleware)
192+
return issubclass(middleware_cls, middleware_class)
174193

175194

176195
def is_toolbar_middleware_installed():
177-
return any(is_toolbar_middleware(middleware)
196+
from debug_toolbar.middleware import DebugToolbarMiddleware
197+
return any(is_middleware_class(DebugToolbarMiddleware, middleware)
178198
for middleware in settings.MIDDLEWARE_CLASSES)
179199

180200

0 commit comments

Comments
 (0)