aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Cramer2011-10-26 13:44:57 -0700
committerDavid Cramer2011-10-26 13:44:57 -0700
commitf3cec8fc9bc65149e7b58a90b5264df4ed6d3859 (patch)
tree4888892ead8db417ad6b7034c2c66b9052c63594
parentc9147364e40fd01d5fafcbdeb1c9563d2b5a4361 (diff)
parente455bec46f7beb92526acf100d269d88c2ede064 (diff)
downloaddjango-debug-toolbar-f3cec8fc9bc65149e7b58a90b5264df4ed6d3859.tar.bz2
Merge pull request #223 from Apkawa/master
Fixed profiling.ProfilingDebugPanel and bug for raw sql with no latin comments
-rw-r--r--debug_toolbar/middleware.py1
-rw-r--r--debug_toolbar/panels/profiling.py61
-rw-r--r--debug_toolbar/utils/tracking/db.py5
-rw-r--r--example/example.dbbin55296 -> 55296 bytes
-rw-r--r--example/settings.py42
5 files changed, 75 insertions, 34 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/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,
+ },
+ }
+}