diff options
Diffstat (limited to 'debug_toolbar/middleware.py')
| -rw-r--r-- | debug_toolbar/middleware.py | 78 |
1 files changed, 48 insertions, 30 deletions
diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index be03038..05d8e80 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -1,13 +1,15 @@ """ Debug Toolbar middleware """ +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 @@ -38,8 +40,8 @@ class DebugToolbarMiddleware(object): return cls.debug_toolbars.get(thread.get_ident()) def __init__(self): - self.override_url = True - + self._urlconfs = {} + # Set method to use to decide to show toolbar self.show_toolbar = self._show_toolbar # default @@ -57,31 +59,44 @@ 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 or getattr(settings, 'TEST', False)): + + # if not internal ip, and not DEBUG + if not (remote_addr in settings.INTERNAL_IPS or settings.DEBUG): return False + return True def process_request(self, request): + __traceback_hide__ = True if self.show_toolbar(request): - if self.override_url: - 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' + + 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: @@ -89,6 +104,7 @@ class DebugToolbarMiddleware(object): self.__class__.debug_toolbars[thread.get_ident()] = toolbar def process_view(self, request, view_func, view_args, view_kwargs): + __traceback_hide__ = True toolbar = self.__class__.debug_toolbars.get(thread.get_ident()) if not toolbar: return @@ -96,22 +112,24 @@ class DebugToolbarMiddleware(object): panel.process_view(request, view_func, view_args, view_kwargs) def process_response(self, request, response): + __traceback_hide__ = True ident = thread.get_ident() toolbar = self.__class__.debug_toolbars.get(ident) if not toolbar: return response - if toolbar.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 and 'gzip' not in response.get('Content-Encoding', '') and \ - response['Content-Type'].split(';')[0] in _HTML_TYPES: + 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) response.content = replace_insensitive( |
