aboutsummaryrefslogtreecommitdiffstats
path: root/debug_toolbar/middleware.py
diff options
context:
space:
mode:
Diffstat (limited to 'debug_toolbar/middleware.py')
-rw-r--r--debug_toolbar/middleware.py113
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