Mercurial > piecrust2
comparison 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 |
comparison
equal
deleted
inserted
replaced
555:daf8df5ade7d | 556:93b656f0af54 |
---|---|
1 import os.path | 1 import os.path |
2 from werkzeug.exceptions import NotFound, Forbidden | |
2 from werkzeug.wrappers import Request, Response | 3 from werkzeug.wrappers import Request, Response |
3 from werkzeug.wsgi import ClosingIterator | 4 from werkzeug.wsgi import ClosingIterator |
4 from piecrust import RESOURCES_DIR, CACHE_DIR | 5 from piecrust import RESOURCES_DIR, CACHE_DIR |
5 from piecrust.serving.util import make_wrapped_file_response | 6 from piecrust.data.builder import ( |
7 DataBuildingContext, build_page_data) | |
8 from piecrust.data.debug import build_var_debug_info | |
9 from piecrust.routing import RouteNotFoundError | |
10 from piecrust.serving.util import ( | |
11 make_wrapped_file_response, get_requested_page, get_app_for_server) | |
12 from piecrust.sources.pageref import PageNotFoundError | |
6 | 13 |
7 | 14 |
8 class StaticResourcesMiddleware(object): | 15 class StaticResourcesMiddleware(object): |
9 """ WSGI middleware that serves static files from the `resources/server` | 16 """ WSGI middleware that serves static files from the `resources/server` |
10 directory in the PieCrust package. | 17 directory in the PieCrust package. |
36 def __init__(self, app, root_dir, debug=False, | 43 def __init__(self, app, root_dir, debug=False, |
37 sub_cache_dir=None, run_sse_check=None): | 44 sub_cache_dir=None, run_sse_check=None): |
38 self.app = app | 45 self.app = app |
39 self.root_dir = root_dir | 46 self.root_dir = root_dir |
40 self.debug = debug | 47 self.debug = debug |
48 self.sub_cache_dir = sub_cache_dir | |
41 self.run_sse_check = run_sse_check | 49 self.run_sse_check = run_sse_check |
42 self._proc_loop = None | 50 self._proc_loop = None |
43 self._out_dir = os.path.join(root_dir, CACHE_DIR, 'server') | 51 self._out_dir = os.path.join(root_dir, CACHE_DIR, 'server') |
44 if sub_cache_dir: | 52 if sub_cache_dir: |
45 self._out_dir = os.path.join(sub_cache_dir, 'server') | 53 self._out_dir = os.path.join(sub_cache_dir, 'server') |
46 self._handlers = { | 54 self._handlers = { |
55 'debug_info': self._getDebugInfo, | |
47 'werkzeug_shutdown': self._shutdownWerkzeug, | 56 'werkzeug_shutdown': self._shutdownWerkzeug, |
48 'pipeline_status': self._startSSEProvider} | 57 'pipeline_status': self._startSSEProvider} |
49 | 58 |
50 if not self.run_sse_check or self.run_sse_check(): | 59 if not self.run_sse_check or self.run_sse_check(): |
51 # When using a server with code reloading, some implementations | 60 # When using a server with code reloading, some implementations |
68 if handler is not None: | 77 if handler is not None: |
69 return handler(request, start_response) | 78 return handler(request, start_response) |
70 | 79 |
71 return self.app(environ, start_response) | 80 return self.app(environ, start_response) |
72 | 81 |
82 def _getDebugInfo(self, request, start_response): | |
83 app = get_app_for_server(self.root_dir, debug=self.debug, | |
84 sub_cache_dir=self.sub_cache_dir) | |
85 if not app.config.get('site/enable_debug_info'): | |
86 return Forbidden() | |
87 | |
88 found = False | |
89 page_path = request.args.get('page') | |
90 try: | |
91 req_page = get_requested_page(app, page_path) | |
92 found = (req_page is not None) | |
93 except (RouteNotFoundError, PageNotFoundError): | |
94 pass | |
95 if not found: | |
96 return NotFound("No such page: %s" % page_path) | |
97 | |
98 ctx = DataBuildingContext(req_page.qualified_page, | |
99 page_num=req_page.page_num) | |
100 data = build_page_data(ctx) | |
101 | |
102 var_path = request.args.getlist('var') | |
103 if not var_path: | |
104 var_path = None | |
105 output = build_var_debug_info(data, var_path) | |
106 | |
107 response = Response(output, mimetype='text/html') | |
108 return response(request.environ, start_response) | |
109 | |
73 def _shutdownWerkzeug(self, request, start_response): | 110 def _shutdownWerkzeug(self, request, start_response): |
74 shutdown_func = request.environ.get('werkzeug.server.shutdown') | 111 shutdown_func = request.environ.get('werkzeug.server.shutdown') |
75 if shutdown_func is None: | 112 if shutdown_func is None: |
76 raise RuntimeError('Not running with the Werkzeug Server') | 113 raise RuntimeError('Not running with the Werkzeug Server') |
77 shutdown_func() | 114 shutdown_func() |