diff options
Diffstat (limited to 'debug_toolbar/middleware.py')
| -rw-r--r-- | debug_toolbar/middleware.py | 52 |
1 files changed, 33 insertions, 19 deletions
diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index 0931389..b4619da 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -1,7 +1,7 @@ """ Debug Toolbar middleware """ -import os +import thread from django.conf import settings from django.http import HttpResponseRedirect @@ -31,8 +31,13 @@ class DebugToolbarMiddleware(object): Middleware to set up Debug Toolbar on incoming request and render toolbar on outgoing response. """ + debug_toolbars = {} + + @classmethod + def get_current(cls): + return cls.debug_toolbars.get(thread.get_ident()) + def __init__(self): - self.debug_toolbars = {} self.override_url = True # Set method to use to decide to show toolbar @@ -60,33 +65,42 @@ class DebugToolbarMiddleware(object): if not remote_addr in settings.INTERNAL_IPS \ or (request.is_ajax() and \ not debug_toolbar.urls._PREFIX in request.path) \ - or not settings.DEBUG: + or not (settings.DEBUG or getattr(settings, 'TEST', False)): return False return True def process_request(self, request): if self.show_toolbar(request): if self.override_url: - original_urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) + original_urlconf = __import__(getattr(request, 'urlconf', settings.ROOT_URLCONF), {}, {}, ['*']) debug_toolbar.urls.urlpatterns += patterns('', ('', include(original_urlconf)), ) + if hasattr(original_urlconf, 'handler404'): + debug_toolbar.urls.handler404 = original_urlconf.handler404 + if hasattr(original_urlconf, 'handler500'): + debug_toolbar.urls.handler500 = original_urlconf.handler500 self.override_url = False request.urlconf = 'debug_toolbar.urls' - self.debug_toolbars[request] = DebugToolbar(request) - for panel in self.debug_toolbars[request].panels: + toolbar = DebugToolbar(request) + for panel in toolbar.panels: panel.process_request(request) + self.__class__.debug_toolbars[thread.get_ident()] = toolbar def process_view(self, request, view_func, view_args, view_kwargs): - if request in self.debug_toolbars: - for panel in self.debug_toolbars[request].panels: - panel.process_view(request, view_func, view_args, view_kwargs) + toolbar = self.__class__.debug_toolbars.get(thread.get_ident()) + if not toolbar: + return + for panel in toolbar.panels: + panel.process_view(request, view_func, view_args, view_kwargs) def process_response(self, request, response): - if request not in self.debug_toolbars: + ident = thread.get_ident() + toolbar = self.__class__.debug_toolbars.get(ident) + if not toolbar: return response - if self.debug_toolbars[request].config['INTERCEPT_REDIRECTS']: + if toolbar.config['INTERCEPT_REDIRECTS']: if isinstance(response, HttpResponseRedirect): redirect_to = response.get('Location', None) if redirect_to: @@ -96,15 +110,15 @@ class DebugToolbarMiddleware(object): {'redirect_to': redirect_to} ) response.cookies = cookies - if response.status_code == 200: - for panel in self.debug_toolbars[request].panels: + if response.status_code == 200 and 'gzip' not in response.get('Content-Encoding', '') and \ + response.get('Content-Type', '').split(';')[0] in _HTML_TYPES: + for panel in toolbar.panels: panel.process_response(request, response) - if response.get('Content-Type', None) and response['Content-Type'].split(';')[0] in _HTML_TYPES: - response.content = replace_insensitive( - smart_unicode(response.content), - self.tag, - smart_unicode(self.debug_toolbars[request].render_toolbar() + self.tag)) + response.content = replace_insensitive( + smart_unicode(response.content), + self.tag, + smart_unicode(toolbar.render_toolbar() + self.tag)) if response.get('Content-Length', None): response['Content-Length'] = len(response.content) - del self.debug_toolbars[request] + del self.__class__.debug_toolbars[ident] return response |
