diff piecrust/serving/middlewares.py @ 556:93b656f0af54

serve: Improve debug information in the preview server. Now the debug window only loads debug info on demand.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 12 Aug 2015 23:18:35 -0700
parents cc6f3dbe3048
children 3ceeca7bb71c
line wrap: on
line diff
--- a/piecrust/serving/middlewares.py	Wed Aug 12 23:04:46 2015 -0700
+++ b/piecrust/serving/middlewares.py	Wed Aug 12 23:18:35 2015 -0700
@@ -1,8 +1,15 @@
 import os.path
+from werkzeug.exceptions import NotFound, Forbidden
 from werkzeug.wrappers import Request, Response
 from werkzeug.wsgi import ClosingIterator
 from piecrust import RESOURCES_DIR, CACHE_DIR
-from piecrust.serving.util import make_wrapped_file_response
+from piecrust.data.builder import (
+        DataBuildingContext, build_page_data)
+from piecrust.data.debug import build_var_debug_info
+from piecrust.routing import RouteNotFoundError
+from piecrust.serving.util import (
+        make_wrapped_file_response, get_requested_page, get_app_for_server)
+from piecrust.sources.pageref import PageNotFoundError
 
 
 class StaticResourcesMiddleware(object):
@@ -38,12 +45,14 @@
         self.app = app
         self.root_dir = root_dir
         self.debug = debug
+        self.sub_cache_dir = sub_cache_dir
         self.run_sse_check = run_sse_check
         self._proc_loop = None
         self._out_dir = os.path.join(root_dir, CACHE_DIR, 'server')
         if sub_cache_dir:
             self._out_dir = os.path.join(sub_cache_dir, 'server')
         self._handlers = {
+                'debug_info': self._getDebugInfo,
                 'werkzeug_shutdown': self._shutdownWerkzeug,
                 'pipeline_status': self._startSSEProvider}
 
@@ -70,6 +79,34 @@
 
         return self.app(environ, start_response)
 
+    def _getDebugInfo(self, request, start_response):
+        app = get_app_for_server(self.root_dir, debug=self.debug,
+                                 sub_cache_dir=self.sub_cache_dir)
+        if not app.config.get('site/enable_debug_info'):
+            return Forbidden()
+
+        found = False
+        page_path = request.args.get('page')
+        try:
+            req_page = get_requested_page(app, page_path)
+            found = (req_page is not None)
+        except (RouteNotFoundError, PageNotFoundError):
+            pass
+        if not found:
+            return NotFound("No such page: %s" % page_path)
+
+        ctx = DataBuildingContext(req_page.qualified_page,
+                                  page_num=req_page.page_num)
+        data = build_page_data(ctx)
+
+        var_path = request.args.getlist('var')
+        if not var_path:
+            var_path = None
+        output = build_var_debug_info(data, var_path)
+
+        response = Response(output, mimetype='text/html')
+        return response(request.environ, start_response)
+
     def _shutdownWerkzeug(self, request, start_response):
         shutdown_func = request.environ.get('werkzeug.server.shutdown')
         if shutdown_func is None: