aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAymeric Augustin2013-11-10 23:07:56 +0100
committerAymeric Augustin2013-11-10 23:45:45 +0100
commit9f089f061a737e7bb1620f03befe966e1c771087 (patch)
tree86b4a2f265df5fc078adc1948f3f4b57fab92b6f
parent35f90e2644dcb9e49247b80535f3a4e070b8943b (diff)
downloaddjango-debug-toolbar-9f089f061a737e7bb1620f03befe966e1c771087.tar.bz2
Be resilient if not all middleware run.
Fix #129.
-rw-r--r--debug_toolbar/panels/headers.py6
-rw-r--r--debug_toolbar/panels/request_vars.py17
-rw-r--r--debug_toolbar/panels/template.py5
-rw-r--r--debug_toolbar/panels/timer.py12
-rw-r--r--tests/test_integration.py10
5 files changed, 30 insertions, 20 deletions
diff --git a/debug_toolbar/panels/headers.py b/debug_toolbar/panels/headers.py
index 36ecf3c..2a41081 100644
--- a/debug_toolbar/panels/headers.py
+++ b/debug_toolbar/panels/headers.py
@@ -49,13 +49,15 @@ class HeaderDebugPanel(DebugPanel):
self.request_headers['Cookie'] = '=> see Request Vars panel'
self.environ = OrderedDict(
(k, v) for (k, v) in wsgi_env if k in self.environ_filter)
+ self.record_stats({
+ 'request_headers': self.request_headers,
+ 'environ': self.environ,
+ })
def process_response(self, request, response):
self.response_headers = OrderedDict(sorted(response.items()))
self.record_stats({
- 'request_headers': self.request_headers,
'response_headers': self.response_headers,
- 'environ': self.environ,
})
diff --git a/debug_toolbar/panels/request_vars.py b/debug_toolbar/panels/request_vars.py
index dc5b7b0..b5e7070 100644
--- a/debug_toolbar/panels/request_vars.py
+++ b/debug_toolbar/panels/request_vars.py
@@ -23,14 +23,11 @@ class RequestVarsDebugPanel(DebugPanel):
def title(self):
return _('Request Vars')
- def process_request(self, request):
- self.request = request
-
def process_response(self, request, response):
self.record_stats({
- 'get': [(k, self.request.GET.getlist(k)) for k in sorted(self.request.GET)],
- 'post': [(k, self.request.POST.getlist(k)) for k in sorted(self.request.POST)],
- 'cookies': [(k, self.request.COOKIES.get(k)) for k in sorted(self.request.COOKIES)],
+ 'get': [(k, request.GET.getlist(k)) for k in sorted(request.GET)],
+ 'post': [(k, request.POST.getlist(k)) for k in sorted(request.POST)],
+ 'cookies': [(k, request.COOKIES.get(k)) for k in sorted(request.COOKIES)],
})
view_info = {
'view_func': _('<no view>'),
@@ -39,7 +36,7 @@ class RequestVarsDebugPanel(DebugPanel):
'view_urlname': 'None',
}
try:
- match = resolve(self.request.path)
+ match = resolve(request.path)
func, args, kwargs = match
view_info['view_func'] = get_name_from_obj(func)
view_info['view_args'] = args
@@ -50,8 +47,8 @@ class RequestVarsDebugPanel(DebugPanel):
pass
self.record_stats(view_info)
- if hasattr(self.request, 'session'):
+ if hasattr(request, 'session'):
self.record_stats({
- 'session': [(k, self.request.session.get(k))
- for k in sorted(self.request.session.keys(), key=force_text)]
+ 'session': [(k, request.session.get(k))
+ for k in sorted(request.session.keys(), key=force_text)]
})
diff --git a/debug_toolbar/panels/template.py b/debug_toolbar/panels/template.py
index 711193e..172765a 100644
--- a/debug_toolbar/panels/template.py
+++ b/debug_toolbar/panels/template.py
@@ -120,14 +120,11 @@ class TemplateDebugPanel(DebugPanel):
num_templates = len(self.templates)
return _('Templates (%(num_templates)s rendered)') % {'num_templates': num_templates}
- def process_request(self, request):
- self.request = request
-
def process_response(self, request, response):
context_processors = dict(
[
("%s.%s" % (k.__module__, k.__name__),
- pformat(k(self.request))) for k in get_standard_processors()
+ pformat(k(request))) for k in get_standard_processors()
]
)
template_context = []
diff --git a/debug_toolbar/panels/timer.py b/debug_toolbar/panels/timer.py
index ac8a808..9a0fef3 100644
--- a/debug_toolbar/panels/timer.py
+++ b/debug_toolbar/panels/timer.py
@@ -32,8 +32,10 @@ class TimerDebugPanel(DebugPanel):
self._start_rusage = resource.getrusage(resource.RUSAGE_SELF)
def process_response(self, request, response):
- stats = {'total_time': (time.time() - self._start_time) * 1000}
- if self.has_resource:
+ stats = {}
+ if hasattr(self, '_start_time'):
+ stats['total_time'] = (time.time() - self._start_time) * 1000
+ if hasattr(self, '_start_rusage'):
self._end_rusage = resource.getrusage(resource.RUSAGE_SELF)
stats['utime'] = 1000 * self._elapsed_ru('ru_utime')
stats['stime'] = 1000 * self._elapsed_ru('ru_stime')
@@ -62,15 +64,17 @@ class TimerDebugPanel(DebugPanel):
def nav_subtitle(self):
stats = self.get_stats()
- if self.has_resource:
+ if hasattr(self, '_start_rusage'):
utime = self._end_rusage.ru_utime - self._start_rusage.ru_utime
stime = self._end_rusage.ru_stime - self._start_rusage.ru_stime
return _('CPU: %(cum)0.2fms (%(total)0.2fms)') % {
'cum': (utime + stime) * 1000.0,
'total': stats['total_time']
}
- else:
+ elif 'total_time' in stats:
return _('TOTAL: %0.2fms') % stats['total_time']
+ else:
+ return ''
def title(self):
return _('Time')
diff --git a/tests/test_integration.py b/tests/test_integration.py
index 4bb0d38..a80f50c 100644
--- a/tests/test_integration.py
+++ b/tests/test_integration.py
@@ -12,6 +12,7 @@ from debug_toolbar.middleware import DebugToolbarMiddleware, show_toolbar
from debug_toolbar.panels.request_vars import RequestVarsDebugPanel
from .base import BaseTestCase
+from .views import regular_view
rf = RequestFactory()
@@ -117,6 +118,15 @@ class DebugToolbarTestCase(BaseTestCase):
self.assertEqual(stats['view_kwargs'], 'None')
self.assertEqual(stats['view_func'], '<no view>')
+ # Django doesn't guarantee that process_request, process_view and
+ # process_response always get called in this order.
+
+ def test_middleware_view_only(self):
+ DebugToolbarMiddleware().process_view(self.request, regular_view, ('title',), {})
+
+ def test_middleware_response_only(self):
+ DebugToolbarMiddleware().process_response(self.request, self.response)
+
@override_settings(DEBUG=True)
class DebugToolbarIntegrationTestCase(TestCase):