diff options
| -rw-r--r-- | debug_toolbar/middleware.py | 1 | ||||
| -rw-r--r-- | debug_toolbar/panels/profiling.py | 61 | ||||
| -rw-r--r-- | debug_toolbar/panels/timer.py | 78 | ||||
| -rw-r--r-- | debug_toolbar/panels/version.py | 2 | ||||
| -rw-r--r-- | debug_toolbar/utils/tracking/db.py | 5 | ||||
| -rw-r--r-- | example/example.db | bin | 55296 -> 55296 bytes | |||
| -rw-r--r-- | example/settings.py | 42 | 
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.dbBinary files differ index 7acdc0d..dbbe0c9 100644 --- a/example/example.db +++ b/example/example.db 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, +        }, +    } +} | 
