Mercurial > piecrust2
diff piecrust/serving/wrappers.py @ 374:fa3ee8a8ee2d
serve: Split the server code in a couple modules inside a `serving` package.
This makes the `serve` command's code a bit more removed from implementation
details, and paves the way for the CMS mode.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Thu, 07 May 2015 21:37:38 -0700 |
parents | |
children | 9612cfc6455a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/piecrust/serving/wrappers.py Thu May 07 21:37:38 2015 -0700 @@ -0,0 +1,66 @@ +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 +