diff options
| author | Aymeric Augustin | 2013-11-26 23:41:11 +0100 | 
|---|---|---|
| committer | Aymeric Augustin | 2013-11-26 23:45:03 +0100 | 
| commit | 2c5fae5c5582cdc00535ca16b0b2f5e3d27c6244 (patch) | |
| tree | 080993af6a7988dc8e61f7ea9e6ae357201051b0 /debug_toolbar | |
| parent | 48441362cf76fdaef0c0849700cd46f33d14b8b8 (diff) | |
| download | django-debug-toolbar-2c5fae5c5582cdc00535ca16b0b2f5e3d27c6244.tar.bz2 | |
Add comments in DebugToolbarMiddleware.
Reorder process_response slightly to ensure instrumentation is
deactivated for streaming responses.
Diffstat (limited to 'debug_toolbar')
| -rw-r--r-- | debug_toolbar/middleware.py | 50 | 
1 files changed, 37 insertions, 13 deletions
| diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index b58f588..b6099d3 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -39,27 +39,35 @@ class DebugToolbarMiddleware(object):      debug_toolbars = {}      def process_request(self, request): +        # Decide whether the toolbar is active for this request.          func_path = dt_settings.CONFIG['SHOW_TOOLBAR_CALLBACK']          # Replace this with import_by_path in Django >= 1.6.          mod_path, func_name = func_path.rsplit('.', 1)          show_toolbar = getattr(import_module(mod_path), func_name)          if not show_toolbar(request):              return -        response = None +          toolbar = DebugToolbar(request) +        self.__class__.debug_toolbars[threading.current_thread().ident] = toolbar + +        # Activate instrumentation ie. monkey-patch.          for panel in toolbar.enabled_panels:              panel.enable_instrumentation() + +        # Run process_request methods of panels like Django middleware. +        response = None          for panel in toolbar.enabled_panels:              response = panel.process_request(request)              if response:                  break -        self.__class__.debug_toolbars[threading.current_thread().ident] = toolbar          return response      def process_view(self, request, view_func, view_args, view_kwargs):          toolbar = self.__class__.debug_toolbars.get(threading.current_thread().ident)          if not toolbar:              return + +        # Run process_view methods of panels like Django middleware.          response = None          for panel in toolbar.enabled_panels:              response = panel.process_view(request, view_func, view_args, view_kwargs) @@ -69,26 +77,42 @@ class DebugToolbarMiddleware(object):      def process_response(self, request, response):          toolbar = self.__class__.debug_toolbars.pop(threading.current_thread().ident, None) -        if not toolbar or getattr(response, 'streaming', False): +        if not toolbar:              return response + +        # Run process_response methods of panels like Django middleware.          for panel in reversed(toolbar.enabled_panels):              new_response = panel.process_response(request, response)              if new_response:                  response = new_response + +        # Deactivate instrumentation ie. monkey-unpatch. This must run +        # regardless of the response. Keep 'return' clauses below. +        # (NB: Django's model for middleware doesn't guarantee anything.)          for panel in reversed(toolbar.enabled_panels):              panel.disable_instrumentation() + +        # Check for responses where the toolbar can't be inserted. +        content_encoding = response.get('Content-Encoding', '') +        content_type = response.get('Content-Type', '').split(';')[0] +        if any((getattr(response, 'streaming', False), +                'gzip' in content_encoding, +                content_type not in _HTML_TYPES)): +            return response + +        # Collapse the toolbar by default if SHOW_COLLAPSED is set.          if toolbar.config['SHOW_COLLAPSED'] and 'djdt' not in request.COOKIES:              response.set_cookie('djdt', 'hide', 864000) -        if ('gzip' not in response.get('Content-Encoding', '') and -                response.get('Content-Type', '').split(';')[0] in _HTML_TYPES): -            content = force_text(response.content, encoding=settings.DEFAULT_CHARSET) -            try: -                insert_at = content.lower().rindex(dt_settings.CONFIG['INSERT_BEFORE'].lower()) -            except ValueError: -                pass -            else: -                toolbar_content = toolbar.render_toolbar() -                response.content = content[:insert_at] + toolbar_content + content[insert_at:] + +        # Insert the toolbar in the response. +        content = force_text(response.content, encoding=settings.DEFAULT_CHARSET) +        try: +            insert_at = content.lower().rindex(dt_settings.CONFIG['INSERT_BEFORE'].lower()) +        except ValueError: +            pass +        else: +            toolbar_content = toolbar.render_toolbar() +            response.content = content[:insert_at] + toolbar_content + content[insert_at:]              if response.get('Content-Length', None):                  response['Content-Length'] = len(response.content)          return response | 
