Skip to content

Instantly share code, notes, and snippets.

@dcramer
Created March 24, 2011 21:25
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dcramer/885932 to your computer and use it in GitHub Desktop.
Save dcramer/885932 to your computer and use it in GitHub Desktop.
Django Debug Toolbar On-Demand
from django.conf import settings
from django.conf.urls.defaults import include, patterns
from django.http import HttpResponse
from django.utils.encoding import smart_unicode
if 'debug_toolbar' not in settings.INSTALLED_APPS:
class DebugMiddleware(object):
pass
else:
import debug_toolbar.urls
from debug_toolbar.middleware import DebugToolbarMiddleware, replace_insensitive
from debug_toolbar.toolbar.loader import DebugToolbar
class DebugMiddleware(DebugToolbarMiddleware):
def _show_toolbar(self, request):
if '_debug' not in request.GET:
return False
if not self._process_urls(request):
return False
return True
def _process_urls(self, request):
# Modify this to fit your own internal logic
if not ((request.user.is_authenticated() and request.user.is_superuser) or settings.DEBUG):
return False
if (request.is_ajax() and not debug_toolbar.urls._PREFIX in request.path):
return False
return True
def process_request(self, request):
if self._process_urls(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'
toolbar = DebugToolbar(request)
toolbar.orig_DEBUG = settings.DEBUG
settings.DEBUG = True
for panel in toolbar.panels:
panel.process_request(request)
self.debug_toolbars[request] = toolbar
def process_response(self, request, response):
toolbar = self.debug_toolbars.get(request)
if not toolbar:
return response
settings.DEBUG = toolbar.orig_DEBUG
if not self._show_toolbar(request):
return response
response = HttpResponse('''<html><head></head><body></body><script type="text/javascript">djdt.ready(function(d){
var $ = d.jQuery;
d.show_toolbar(false);
$($("#djDebugPanelList .djDebugPanelButton a")[0]).click();
});</script></html>''')
for panel in toolbar.panels:
panel.process_response(request, response)
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]
return response
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment