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()