diff options
| author | Rob Hudson | 2009-10-16 20:35:10 -0700 |
|---|---|---|
| committer | Rob Hudson | 2009-10-16 20:35:10 -0700 |
| commit | d446d1b7032cce610d0e78965a66316e16c82924 (patch) | |
| tree | fb469440487bbebecaa32c3f2416e1eea64230c9 /debug_toolbar/panels | |
| parent | 5d4fbe175509c73f461c5271a555c952465eeded (diff) | |
| parent | 56a673fd9414bad98388023a151e618bbb46835d (diff) | |
| download | django-debug-toolbar-d446d1b7032cce610d0e78965a66316e16c82924.tar.bz2 | |
Merge branch 'master' into tx-master
Diffstat (limited to 'debug_toolbar/panels')
| -rw-r--r-- | debug_toolbar/panels/request_vars.py | 10 | ||||
| -rw-r--r-- | debug_toolbar/panels/sql.py | 75 | ||||
| -rw-r--r-- | debug_toolbar/panels/template.py | 52 |
3 files changed, 65 insertions, 72 deletions
diff --git a/debug_toolbar/panels/request_vars.py b/debug_toolbar/panels/request_vars.py index d0a8c19..3f6aea5 100644 --- a/debug_toolbar/panels/request_vars.py +++ b/debug_toolbar/panels/request_vars.py @@ -10,10 +10,10 @@ class RequestVarsDebugPanel(DebugPanel): def nav_title(self): return 'Request Vars' - + def title(self): return 'Request Vars' - + def url(self): return '' @@ -24,7 +24,9 @@ class RequestVarsDebugPanel(DebugPanel): context = { 'get': [(k, self.request.GET.getlist(k)) for k in self.request.GET.iterkeys()], 'post': [(k, self.request.POST.getlist(k)) for k in self.request.POST.iterkeys()], - 'session': [(k, self.request.session.get(k)) for k in self.request.session.iterkeys()], 'cookies': [(k, self.request.COOKIES.get(k)) for k in self.request.COOKIES.iterkeys()], } - return render_to_string('debug_toolbar/panels/request_vars.html', context)
\ No newline at end of file + if hasattr(self.request, 'session'): + context['session'] = [(k, self.request.session.get(k)) for k in self.request.session.iterkeys()] + + return render_to_string('debug_toolbar/panels/request_vars.html', context) diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py index 17f4598..e1a2b7d 100644 --- a/debug_toolbar/panels/sql.py +++ b/debug_toolbar/panels/sql.py @@ -1,7 +1,8 @@ +from datetime import datetime import os import SocketServer -from datetime import datetime import traceback + import django from django.conf import settings from django.db import connection @@ -10,7 +11,9 @@ from django.template.loader import render_to_string from django.utils import simplejson from django.utils.encoding import force_unicode from django.utils.hashcompat import sha_constructor + from debug_toolbar.panels import DebugPanel +from debug_toolbar.utils import sqlparse # Figure out some paths django_path = os.path.realpath(os.path.dirname(django.__file__)) @@ -18,48 +21,8 @@ socketserver_path = os.path.realpath(os.path.dirname(SocketServer.__file__)) # TODO:This should be set in the toolbar loader as a default and panels should # get a copy of the toolbar object with access to its config dictionary -SQL_WARNING_THRESHOLD = getattr(settings, 'DEBUG_TOOLBAR_CONFIG', {}).get('SQL_WARNING_THRESHOLD', 500) - -# Note: This isn't intended to catch ALL possible SQL keywords, just a good common set. -# Note: Subsets are listed last to avoid matching a subset of a keyword. This -# whole thing could be greatly improved but for now this works. -SQL_KEYWORDS = ( - 'ALTER', - 'AND', - 'ASC', - 'AS', - 'AVG', - 'COUNT', - 'CREATE', - 'DESC', - 'DELETE', - 'DISTINCT', - 'DROP', - 'FROM', - 'GROUP BY', - 'HAVING', - 'INNER JOIN', - 'INSERT', - 'IN', - 'LEFT OUTER JOIN', - 'LIKE', - 'LIMIT', - 'MAX', - 'MIN', - 'OFFSET', - 'ON', - 'ORDER BY', - 'OR', - 'SELECT', - 'SET', - 'STDDEV_POP', - 'STDDEV_SAMP', - 'SUM', - 'UPDATE', - 'VAR_POP', - 'VAR_SAMP', - 'WHERE', -) +SQL_WARNING_THRESHOLD = getattr(settings, 'DEBUG_TOOLBAR_CONFIG', {}) \ + .get('SQL_WARNING_THRESHOLD', 500) def tidy_stacktrace(strace): """ @@ -71,7 +34,8 @@ def tidy_stacktrace(strace): trace = [] for s in strace[:-1]: s_path = os.path.realpath(s[0]) - if django_path in s_path and not 'django/contrib' in s_path: + if getattr(settings, 'DEBUG_TOOLBAR_CONFIG', {}).get('HIDE_DJANGO_SQL', True) \ + and django_path in s_path and not 'django/contrib' in s_path: continue if socketserver_path in s_path: continue @@ -106,7 +70,8 @@ class DatabaseStatTracker(util.CursorDebugWrapper): 'stacktrace': stacktrace, 'start_time': start, 'stop_time': stop, - 'is_slow': (duration > SQL_WARNING_THRESHOLD) + 'is_slow': (duration > SQL_WARNING_THRESHOLD), + 'is_select': sql.lower().strip().startswith('select'), }) util.CursorDebugWrapper = DatabaseStatTracker @@ -166,8 +131,20 @@ def ms_from_timedelta(td): """ return (td.seconds * 1000) + (td.microseconds / 1000.0) -def reformat_sql(sql): - for kwd in SQL_KEYWORDS: - sql = sql.replace(kwd, '<strong>%s</strong>' % (kwd,)) - return sql +class BoldKeywordFilter(sqlparse.filters.Filter): + """sqlparse filter to bold SQL keywords""" + def process(self, stack, stream): + """Process the token stream""" + for token_type, value in stream: + is_keyword = token_type in sqlparse.tokens.Keyword + if is_keyword: + yield sqlparse.tokens.Text, '<strong>' + yield token_type, value + if is_keyword: + yield sqlparse.tokens.Text, '</strong>' +def reformat_sql(sql): + stack = sqlparse.engine.FilterStack() + stack.preprocess.append(BoldKeywordFilter()) # add our custom filter + stack.postprocess.append(sqlparse.filters.SerializerUnicode()) # tokens -> strings + return ''.join(stack.run(sql)) diff --git a/debug_toolbar/panels/template.py b/debug_toolbar/panels/template.py index 391902f..c3dc986 100644 --- a/debug_toolbar/panels/template.py +++ b/debug_toolbar/panels/template.py @@ -1,6 +1,7 @@ from os.path import normpath from pprint import pformat +from django import http from django.conf import settings from django.core.signals import request_started from django.dispatch import Signal @@ -37,16 +38,18 @@ class TemplateDebugPanel(DebugPanel): def __init__(self): self.templates = [] - template_rendered.connect(self._storeTemplateInfo) + template_rendered.connect(self._store_template_info) - def _storeTemplateInfo(self, sender, **kwargs): + def _store_template_info(self, sender, **kwargs): self.templates.append(kwargs) def nav_title(self): return _('Templates') def title(self): - return 'Templates' + num_templates = len([t for t in self.templates + if not t['template'].name.startswith('debug_toolbar/')]) + return 'Templates (%s rendered)' % num_templates def url(self): return '' @@ -62,28 +65,39 @@ class TemplateDebugPanel(DebugPanel): ] ) template_context = [] - for i, d in enumerate(self.templates): + for template_data in self.templates: info = {} # Clean up some info about templates - t = d.get('template', None) + template = template_data.get('template', None) # Skip templates that we are generating through the debug toolbar. - if t.name.startswith('debug_toolbar/'): + if template.name.startswith('debug_toolbar/'): continue - if t.origin and t.origin.name: - t.origin_name = t.origin.name + if template.origin and template.origin.name: + template.origin_name = template.origin.name else: - t.origin_name = 'No origin' - info['template'] = t + template.origin_name = 'No origin' + info['template'] = template # Clean up context for better readability - c = d.get('context', None) - - d_list = [] - for _d in c.dicts: - try: - d_list.append(pformat(d)) - except UnicodeEncodeError: - pass - info['context'] = '\n'.join(d_list) + if getattr(settings, 'DEBUG_TOOLBAR_CONFIG', {}).get('SHOW_TEMPLATE_CONTEXT', True): + context_data = template_data.get('context', None) + + context_list = [] + for context_layer in context_data.dicts: + for key, value in context_layer.items(): + # Replace any request elements - they have a large + # unicode representation and the request data is + # already made available from the Request Vars panel. + if isinstance(value, http.HttpRequest): + context_layer[key] = '<<request>>' + # Replace the debugging sql_queries element. The SQL + # data is already made available from the SQL panel. + elif key == 'sql_queries' and isinstance(value, list): + context_layer[key] = '<<sql_queries>>' + try: + context_list.append(pformat(context_layer)) + except UnicodeEncodeError: + pass + info['context'] = '\n'.join(context_list) template_context.append(info) context = { 'templates': template_context, |
