aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--debug_toolbar/middleware.py1
-rw-r--r--debug_toolbar/panels/profiling.py61
-rw-r--r--debug_toolbar/panels/timer.py78
-rw-r--r--debug_toolbar/panels/version.py2
-rw-r--r--debug_toolbar/utils/tracking/db.py5
-rw-r--r--example/example.dbbin55296 -> 55296 bytes
-rw-r--r--example/settings.py42
7 files changed, 107 insertions, 82 deletions
diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py
index f49a29f..8f0445a 100644
--- a/debug_toolbar/middleware.py
+++ b/debug_toolbar/middleware.py
@@ -74,7 +74,6 @@ class DebugToolbarMiddleware(object):
def process_request(self, request):
__traceback_hide__ = True
if self.show_toolbar(request):
-
urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF)
if isinstance(urlconf, basestring):
urlconf = import_module(getattr(request, 'urlconf', settings.ROOT_URLCONF))
diff --git a/debug_toolbar/panels/profiling.py b/debug_toolbar/panels/profiling.py
index 8913621..d07fd2a 100644
--- a/debug_toolbar/panels/profiling.py
+++ b/debug_toolbar/panels/profiling.py
@@ -20,7 +20,7 @@ import os
class DjangoDebugToolbarStats(Stats):
__root = None
-
+
def get_root_func(self):
if self.__root is None:
for func, (cc, nc, tt, ct, callers) in self.stats.iteritems():
@@ -44,14 +44,14 @@ class FunctionCall(object):
self.parent_ids = parent_ids
self.hsv = hsv
self._line_stats_text = None
-
+
def parent_classes(self):
return self.parent_classes
-
+
def background(self):
r,g,b = hsv_to_rgb(*self.hsv)
return 'rgb(%f%%,%f%%,%f%%)' %(r*100, g*100, b*100)
-
+
def func_std_string(self): # match what old profile produced
func_name = self.func
if func_name[:2] == ('~', 0):
@@ -66,16 +66,16 @@ class FunctionCall(object):
idx = file_name.find('/site-packages/')
if idx > -1:
file_name = file_name[idx+14:]
-
+
file_path, file_name = file_name.rsplit(os.sep, 1)
-
+
return mark_safe('<span class="path">{0}/</span><span class="file">{1}</span> in <span class="func">{3}</span>(<span class="lineno">{2}</span>)'.format(
file_path,
file_name,
line_num,
method,
))
-
+
def subfuncs(self):
i=0
h, s, v = self.hsv
@@ -94,36 +94,36 @@ class FunctionCall(object):
id=str(self.id) + '_' + str(i),
parent_ids=self.parent_ids + [self.id],
hsv=(h1,s1,1))
-
+
def count(self):
return self.stats[1]
-
+
def tottime(self):
return self.stats[2]
-
+
def cumtime(self):
cc, nc, tt, ct = self.stats
return self.stats[3]
-
+
def tottime_per_call(self):
cc, nc, tt, ct = self.stats
-
+
if nc == 0:
return 0
-
+
return tt/nc
-
+
def cumtime_per_call(self):
cc, nc, tt, ct = self.stats
-
+
if cc == 0:
return 0
-
+
return ct/cc
-
+
def indent(self):
return 16 * self.depth
-
+
def line_stats_text(self):
if self._line_stats_text is None and DJ_PROFILE_USE_LINE_PROFILER:
lstats = self.statobj.line_stats
@@ -143,16 +143,16 @@ class ProfilingDebugPanel(DebugPanel):
name = 'Profiling'
template = 'debug_toolbar/panels/profiling.html'
has_content = True
-
+
def nav_title(self):
return _('Profiling')
-
+
def url(self):
return ''
-
+
def title(self):
return _('Profiling')
-
+
def _unwrap_closure_and_profile(self, func):
if not hasattr(func, 'func_code'):
return
@@ -161,7 +161,7 @@ class ProfilingDebugPanel(DebugPanel):
for cell in func.func_closure:
if hasattr(cell.cell_contents, 'func_code'):
self._unwrap_closure_and_profile(cell.cell_contents)
-
+
def process_view(self, request, view_func, view_args, view_kwargs):
__traceback_hide__ = True
self.profiler = cProfile.Profile()
@@ -176,7 +176,7 @@ class ProfilingDebugPanel(DebugPanel):
self.line_profiler = None
out = self.profiler.runcall(view_func, *args, **view_kwargs)
return out
-
+
def add_node(self, func_list, func, max_depth, cum_time=0.1):
func_list.append(func)
func.has_subfuncs = False
@@ -187,17 +187,20 @@ class ProfilingDebugPanel(DebugPanel):
(subfunc.func in self.stats.line_stats.timings))):
func.has_subfuncs = True
self.add_node(func_list, subfunc, max_depth, cum_time=cum_time)
-
+
def process_response(self, request, response):
+ __traceback_hide__ = True
+ if not hasattr(self, 'profiler'):
+ return None
self.profiler.create_stats()
self.stats = DjangoDebugToolbarStats(self.profiler)
if DJ_PROFILE_USE_LINE_PROFILER:
self.stats.line_stats = self.line_profiler.get_stats()
self.stats.calc_callees()
-
+
root = FunctionCall(self.stats, self.stats.get_root_func(), depth=0)
-
+
func_list = []
self.add_node(func_list, root, 10, root.stats[3]/8)
-
- self.stats_record({'func_list': func_list})
+
+ self.record_stats({'func_list': func_list})
diff --git a/debug_toolbar/panels/timer.py b/debug_toolbar/panels/timer.py
index 7c0febf..943dd8a 100644
--- a/debug_toolbar/panels/timer.py
+++ b/debug_toolbar/panels/timer.py
@@ -22,58 +22,42 @@ class TimerDebugPanel(DebugPanel):
else:
has_content = True
has_resource = True
-
+
def process_request(self, request):
self._start_time = time.time()
if self.has_resource:
self._start_rusage = resource.getrusage(resource.RUSAGE_SELF)
-
+
def process_response(self, request, response):
- total_time = (time.time() - self._start_time) * 1000
+ stats = {'total_time': (time.time() - self._start_time) * 1000}
if self.has_resource:
self._end_rusage = resource.getrusage(resource.RUSAGE_SELF)
-
- utime = 1000 * self._elapsed_ru('ru_utime')
- stime = 1000 * self._elapsed_ru('ru_stime')
- vcsw = self._elapsed_ru('ru_nvcsw')
- ivcsw = self._elapsed_ru('ru_nivcsw')
- minflt = self._elapsed_ru('ru_minflt')
- majflt = self._elapsed_ru('ru_majflt')
-# these are documented as not meaningful under Linux. If you're running BSD
-# feel free to enable them, and add any others that I hadn't gotten to before
-# I noticed that I was getting nothing but zeroes and that the docs agreed. :-(
-#
-# blkin = self._elapsed_ru('ru_inblock')
-# blkout = self._elapsed_ru('ru_oublock')
-# swap = self._elapsed_ru('ru_nswap')
-# rss = self._end_rusage.ru_maxrss
-# srss = self._end_rusage.ru_ixrss
-# urss = self._end_rusage.ru_idrss
-# usrss = self._end_rusage.ru_isrss
-
- self.record_stats({
- 'total_time': total_time,
- 'utime': utime,
- 'stime': stime,
- 'vcsw': vcsw,
- 'ivcsw': ivcsw,
- 'minflt': minflt,
- 'majflt': majflt,
-# 'blkin': blkin,
-# 'blkout': blkout,
-# 'swap': swap,
-# 'rss': rss,
-# 'urss': urss,
-# 'srss': srss,
-# 'usrss': usrss,
- })
-
+ stats['utime'] = 1000 * self._elapsed_ru('ru_utime')
+ stats['stime'] = 1000 * self._elapsed_ru('ru_stime')
+ stats['vcsw'] = self._elapsed_ru('ru_nvcsw')
+ stats['ivcsw'] = self._elapsed_ru('ru_nivcsw')
+ stats['minflt'] = self._elapsed_ru('ru_minflt')
+ stats['majflt'] = self._elapsed_ru('ru_majflt')
+ # these are documented as not meaningful under Linux. If you're running BSD
+ # feel free to enable them, and add any others that I hadn't gotten to before
+ # I noticed that I was getting nothing but zeroes and that the docs agreed. :-(
+ #
+ # stats['blkin'] = self._elapsed_ru('ru_inblock')
+ # stats['blkout'] = self._elapsed_ru('ru_oublock')
+ # stats['swap'] = self._elapsed_ru('ru_nswap')
+ # stats['rss'] = self._end_rusage.ru_maxrss
+ # stats['srss'] = self._end_rusage.ru_ixrss
+ # stats['urss'] = self._end_rusage.ru_idrss
+ # stats['usrss'] = self._end_rusage.ru_isrss
+
+ self.record_stats(stats)
+
def nav_title(self):
return _('Time')
-
+
def nav_subtitle(self):
stats = self.get_stats()
-
+
# TODO l10n
if self.has_resource:
utime = self._end_rusage.ru_utime - self._start_rusage.ru_utime
@@ -81,19 +65,19 @@ class TimerDebugPanel(DebugPanel):
return 'CPU: %0.2fms (%0.2fms)' % ((utime + stime) * 1000.0, stats['total_time'])
else:
return 'TOTAL: %0.2fms' % (stats['total_time'])
-
+
def title(self):
return _('Resource Usage')
-
+
def url(self):
return ''
-
+
def _elapsed_ru(self, name):
return getattr(self._end_rusage, name) - getattr(self._start_rusage, name)
-
+
def content(self):
stats = self.get_stats()
-
+
# TODO l10n on values
rows = (
(_('User CPU time'), '%0.3f msec' % stats['utime']),
@@ -106,7 +90,7 @@ class TimerDebugPanel(DebugPanel):
# ('Page faults', '%d no i/o, %d requiring i/o' % (stats['minflt'], stats['majflt'])),
# ('Disk operations', '%d in, %d out, %d swapout' % (stats['blkin'], stats['blkout'], stats['swap'])),
)
-
+
context = self.context.copy()
context.update({'rows': rows,})
return render_to_string(self.template, context)
diff --git a/debug_toolbar/panels/version.py b/debug_toolbar/panels/version.py
index 4e58971..8ac0e82 100644
--- a/debug_toolbar/panels/version.py
+++ b/debug_toolbar/panels/version.py
@@ -30,7 +30,7 @@ class VersionDebugPanel(DebugPanel):
def process_response(self, request, response):
versions = {}
versions['Python'] = '%d.%d.%d' % sys.version_info[:3]
- for app in settings.INSTALLED_APPS + ['django']:
+ for app in list(settings.INSTALLED_APPS) + ['django']:
name = app.split('.')[-1].replace('_', ' ').capitalize()
__import__(app)
app = sys.modules[app]
diff --git a/debug_toolbar/utils/tracking/db.py b/debug_toolbar/utils/tracking/db.py
index a40976e..7370374 100644
--- a/debug_toolbar/utils/tracking/db.py
+++ b/debug_toolbar/utils/tracking/db.py
@@ -1,4 +1,3 @@
-import inspect
import sys
from datetime import datetime
@@ -7,7 +6,7 @@ from threading import local
from django.conf import settings
from django.template import Node
from django.utils import simplejson
-from django.utils.encoding import force_unicode
+from django.utils.encoding import force_unicode, smart_str
from django.utils.hashcompat import sha_constructor
from debug_toolbar.utils import ms_from_timedelta, tidy_stacktrace, get_template_info, \
@@ -113,7 +112,7 @@ class NormalCursorWrapper(object):
'duration': duration,
'raw_sql': sql,
'params': _params,
- 'hash': sha_constructor(settings.SECRET_KEY + sql + _params).hexdigest(),
+ 'hash': sha_constructor(settings.SECRET_KEY + smart_str(sql) + _params).hexdigest(),
'stacktrace': stacktrace,
'start_time': start,
'stop_time': stop,
diff --git a/example/example.db b/example/example.db
index 7acdc0d..dbbe0c9 100644
--- a/example/example.db
+++ b/example/example.db
Binary files differ
diff --git a/example/settings.py b/example/settings.py
index fac99af..c421a62 100644
--- a/example/settings.py
+++ b/example/settings.py
@@ -1,5 +1,6 @@
import os
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))
+os.sys.path.insert(0, os.path.dirname(PROJECT_PATH))
ADMIN_MEDIA_PREFIX = '/admin_media/'
DATABASE_ENGINE = 'sqlite3'
@@ -31,7 +32,9 @@ TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
)
TEMPLATE_DEBUG = DEBUG
-TEMPLATE_DIRS = (os.path.join(PROJECT_PATH, 'templates'))
+TEMPLATE_DIRS = (
+ os.path.join(PROJECT_PATH, 'templates'),
+ )
DEBUG_TOOLBAR_PANELS = (
'debug_toolbar.panels.version.VersionDebugPanel',
'debug_toolbar.panels.timer.TimerDebugPanel',
@@ -48,4 +51,41 @@ DEBUG_TOOLBAR_PANELS = (
CACHE_BACKEND = 'dummy://'
#CACHE_BACKEND = 'memcached://127.0.0.1:11211'
+LOGGING = {
+ 'version': 1,
+ 'disable_existing_loggers': True,
+ 'formatters': {
+ 'verbose': {
+ 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
+ },
+ },
+ 'handlers': {
+ 'null': {
+ 'level':'DEBUG',
+ 'class':'django.utils.log.NullHandler',
+ },
+ 'console':{
+ 'level':'DEBUG',
+ 'class':'logging.StreamHandler',
+ 'formatter': 'verbose'
+ },
+ },
+ 'loggers': {
+ 'django': {
+ 'handlers':['null'],
+ 'propagate': True,
+ 'level':'INFO',
+ },
+ 'django.request': {
+ 'handlers': ['console'],
+ 'level': 'ERROR',
+ 'propagate': False,
+ },
+ 'django.db.backends': {
+ 'handlers': ['console'],
+ 'level': 'DEBUG',
+ 'propagate': False,
+ },
+ }
+}