diff options
Diffstat (limited to 'debug_toolbar/middleware.py')
| -rw-r--r-- | debug_toolbar/middleware.py | 113 |
1 files changed, 71 insertions, 42 deletions
diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index de78254..0c6821f 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -1,13 +1,15 @@ """ Debug Toolbar middleware """ -import os +import imp +import thread from django.conf import settings +from django.conf.urls.defaults import include, patterns from django.http import HttpResponseRedirect from django.shortcuts import render_to_response from django.utils.encoding import smart_unicode -from django.conf.urls.defaults import include, patterns +from django.utils.importlib import import_module import debug_toolbar.urls from debug_toolbar.toolbar.loader import DebugToolbar @@ -31,10 +33,15 @@ class DebugToolbarMiddleware(object): Middleware to set up Debug Toolbar on incoming request and render toolbar on outgoing response. """ - def __init__(self): - self.debug_toolbars = {} - self.override_url = True + debug_toolbars = {} + + @classmethod + def get_current(cls): + return cls.debug_toolbars.get(thread.get_ident()) + def __init__(self): + self._urlconfs = {} + # Set method to use to decide to show toolbar self.show_toolbar = self._show_toolbar # default @@ -52,59 +59,81 @@ class DebugToolbarMiddleware(object): self.tag = u'</' + tag + u'>' def _show_toolbar(self, request): + if getattr(settings, 'TEST', False): + return False + x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR', None) if x_forwarded_for: remote_addr = x_forwarded_for.split(',')[0].strip() else: remote_addr = request.META.get('REMOTE_ADDR', None) - 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: - return False - return True + + # if not internal ip, and not DEBUG + return remote_addr in settings.INTERNAL_IPS and bool(settings.DEBUG) def process_request(self, request): + __traceback_hide__ = True if self.show_toolbar(request): - if self.override_url: - original_urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) - debug_toolbar.urls.urlpatterns += patterns('', - ('', include(original_urlconf)), - ) - self.override_url = False - request.urlconf = 'debug_toolbar.urls' - self.debug_toolbars[request] = DebugToolbar(request) - for panel in self.debug_toolbars[request].panels: + urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) + if isinstance(urlconf, basestring): + urlconf = import_module(getattr(request, 'urlconf', settings.ROOT_URLCONF)) + + if urlconf not in self._urlconfs: + new_urlconf = imp.new_module('urlconf') + new_urlconf.urlpatterns = debug_toolbar.urls.urlpatterns + \ + patterns('', + ('', include(urlconf)), + ) + + if hasattr(urlconf, 'handler404'): + new_urlconf.handler404 = urlconf.handler404 + if hasattr(urlconf, 'handler500'): + new_urlconf.handler500 = urlconf.handler500 + + self._urlconfs[urlconf] = new_urlconf + + request.urlconf = self._urlconfs[urlconf] + + 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) + __traceback_hide__ = True + 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: + __traceback_hide__ = True + 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 isinstance(response, HttpResponseRedirect): - redirect_to = response.get('Location', None) - if redirect_to: - cookies = response.cookies - response = render_to_response( - 'debug_toolbar/redirect.html', - {'redirect_to': redirect_to} - ) - response.cookies = cookies - if response.status_code == 200: - for panel in self.debug_toolbars[request].panels: + if isinstance(response, HttpResponseRedirect): + if not toolbar.config['INTERCEPT_REDIRECTS']: + return response + redirect_to = response.get('Location', None) + if redirect_to: + cookies = response.cookies + response = render_to_response( + 'debug_toolbar/redirect.html', + {'redirect_to': redirect_to} + ) + response.cookies = cookies + if '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['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 |
