Mercurial > piecrust2
view piecrust/serving/wrappers.py @ 380:f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
When matching a route like `/foo/%slug%` against an URL like `/foo`, the route
will (correctly) return a match, but it will be completely missing the `slug`
metadata, resulting in problems elsewhere. This change makes it so that any
missing route metadata will be filled in with an empty string.
And because this means generated URLs may differ from the incoming URL when
using trailing slashes (`/foo/` _vs._ `/foo`), we make the assert in the
chef server handle those discrepancies.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 10 May 2015 00:34:21 -0700 |
parents | fa3ee8a8ee2d |
children | 9612cfc6455a |
line wrap: on
line source
import os from piecrust.serving.server import Server from piecrust.serving.procloop import _sse_abort def run_werkzeug_server(root_dir, host, port, debug_piecrust=False, sub_cache_dir=None, use_debugger=False, use_reloader=False): from werkzeug.serving import run_simple def _run_sse_check(): # We don't want to run the processing loop here if this isn't # the actual process that does the serving. In most cases it is, # but if we're using Werkzeug's reloader, then it won't be the # first time we get there... it will only be the correct process # the second time, when the reloading process is spawned, with the # `WERKZEUG_RUN_MAIN` variable set. return (not use_reloader or os.environ.get('WERKZEUG_RUN_MAIN') == 'true') app = _get_piecrust_server(root_dir, debug=debug_piecrust, sub_cache_dir=sub_cache_dir, run_sse_check=_run_sse_check) try: run_simple(host, port, app, threaded=True, use_debugger=use_debugger, use_reloader=use_reloader) finally: _sse_abort.set() def run_gunicorn_server(root_dir, debug_piecrust=False, sub_cache_dir=None, gunicorn_options=None): from gunicorn.app.base import BaseApplication class PieCrustGunicornApplication(BaseApplication): def __init__(self, app, options): self.app = app self.options = options super(PieCrustGunicornApplication, self).__init__() def load_config(self): for k, v in self.options.items(): if k in self.cfg.settings and v is not None: self.cfg.set(k, v) def load(self): return self.app app = _get_piecrust_server(root_dir, debug=debug_piecrust, sub_cache_dir=sub_cache_dir) gunicorn_options = gunicorn_options or {} app_wrapper = PieCrustGunicornApplication(app, gunicorn_options) app_wrapper.run() def _get_piecrust_server(root_dir, **kwargs): server = Server(root_dir, **kwargs) app = server.getWsgiApp() return app