1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 | from django.conf import settings
import django.db as db
from django.utils.html import escape
import re
# sql queries can be quite long and don't contain spaces in their select clause,
# which makes them unwrappable in html.
# from: http://www.djangosnippets.org/snippets/93/
enable_linebreaks_regex = re.compile(",(?! )")
def enable_linebreaks(str):
return enable_linebreaks_regex.sub(",<wbr>", str)
# wraps around a query dict as provided by django, to output the sql part per
# default if accessed without an index.
class SqlQuery(object):
def __init__(self, query):
self.query = query
def __getitem__(self, k):
return self.query[k]
# per default, return the sql query
def __str__(self):
return enable_linebreaks(escape(self['sql']))
# provides sqldebug.queries
class SqlQueries(object):
def __iter__(self):
for q in db.connection.queries:
yield SqlQuery(q)
def __len__(self):
return len(db.connection.queries)
def count(self):
return len(self)
# per default, output as list of LI elements
def __str__(self):
result = ""
for q in self:
result += "<li>" + escape(q["sql"]) + "</li>\n"
return result
# main class for sql debugging info
class SqlDebug(object):
def __init__(self):
# allow access to database queries via attribute
self.queries = SqlQueries()
# per default, display some basic information
def __str__(self):
return "%d queries, %f seconds" % (self.queries.count(), self.time())
# checks whether sql debugging has been enabled
def enabled(self):
return getattr(settings, 'SQL_DEBUG', False) and \
getattr(settings, 'DEBUG', False)
# shortcurt to enabled()
def __nonzero__(self):
return self.enabled()
# returns aggregate time for db operations as a double
def time(self):
secs = 0.0
for s in self.queries:
secs += float(s['time'])
return secs
# context processor function: makes a SqlDebug instance available to templates.
def sqldebug(request):
return {'sqldebug': SqlDebug()}
|
Comments
I love the idea that this is as simple as adding a new variable to the templates. Please forgive the newbie question though. To use this snippet, is adding it as a custom templatetag file enough?
Thank you in advance :)
#