aboutsummaryrefslogtreecommitdiffstats
path: root/debug_toolbar/panels
diff options
context:
space:
mode:
Diffstat (limited to 'debug_toolbar/panels')
-rw-r--r--debug_toolbar/panels/request_vars.py10
-rw-r--r--debug_toolbar/panels/sql.py75
-rw-r--r--debug_toolbar/panels/template.py52
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,