Mercurial > piecrust2
comparison piecrust/commands/builtin/serving.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 | c2ca72fb7f0b |
children | 3ceeca7bb71c |
comparison
equal
deleted
inserted
replaced
373:9fb7c4921d75 | 374:fa3ee8a8ee2d |
---|---|
1 import logging | 1 import logging |
2 from piecrust.serving import Server, _sse_abort | |
3 from piecrust.commands.base import ChefCommand | 2 from piecrust.commands.base import ChefCommand |
3 from piecrust.serving.wrappers import run_werkzeug_server, run_gunicorn_server | |
4 | 4 |
5 | 5 |
6 logger = logging.getLogger(__name__) | 6 logger = logging.getLogger(__name__) |
7 | 7 |
8 | 8 |
35 help="The WSGI server implementation to use", | 35 help="The WSGI server implementation to use", |
36 choices=['werkzeug', 'gunicorn'], | 36 choices=['werkzeug', 'gunicorn'], |
37 default='werkzeug') | 37 default='werkzeug') |
38 | 38 |
39 def run(self, ctx): | 39 def run(self, ctx): |
40 root_dir = ctx.app.root_dir | |
40 host = ctx.args.address | 41 host = ctx.args.address |
41 port = int(ctx.args.port) | 42 port = int(ctx.args.port) |
42 debug = ctx.args.debug or ctx.args.use_debugger | 43 debug = ctx.args.debug or ctx.args.use_debugger |
43 | 44 |
44 server = Server( | |
45 ctx.app.root_dir, | |
46 debug=debug, | |
47 sub_cache_dir=ctx.app.sub_cache_dir, | |
48 use_reloader=ctx.args.use_reloader) | |
49 app = server.getWsgiApp() | |
50 | |
51 if ctx.args.wsgi == 'werkzeug': | 45 if ctx.args.wsgi == 'werkzeug': |
52 from werkzeug.serving import run_simple | 46 run_werkzeug_server( |
53 try: | 47 root_dir, host, port, |
54 run_simple(host, port, app, | 48 debug_piecrust=debug, |
55 threaded=True, | 49 sub_cache_dir=ctx.app.sub_cache_dir, |
56 use_debugger=debug, | 50 use_debugger=debug, |
57 use_reloader=ctx.args.use_reloader) | 51 use_reloader=ctx.args.use_reloader) |
58 finally: | |
59 _sse_abort.set() | |
60 | 52 |
61 elif ctx.args.wsgi == 'gunicorn': | 53 elif ctx.args.wsgi == 'gunicorn': |
62 from gunicorn.app.base import BaseApplication | |
63 | |
64 class PieCrustGunicornApplication(BaseApplication): | |
65 def __init__(self, app, options): | |
66 self.app = app | |
67 self.options = options | |
68 super(PieCrustGunicornApplication, self).__init__() | |
69 | |
70 def load_config(self): | |
71 for k, v in self.options.items(): | |
72 if k in self.cfg.settings and v is not None: | |
73 self.cfg.set(k, v) | |
74 | |
75 def load(self): | |
76 return self.app | |
77 | |
78 options = { | 54 options = { |
79 'bind': '%s:%s' % (host, port), | 55 'bind': '%s:%s' % (host, port), |
80 'accesslog': '-', | 56 'accesslog': '-', # print access log to stderr |
81 'worker_class': 'gaiohttp', | 57 } |
82 'workers': 2, | |
83 'timeout': 999999} | |
84 if debug: | 58 if debug: |
85 options['loglevel'] = 'debug' | 59 options['loglevel'] = 'debug' |
86 if ctx.args.use_reloader: | 60 if ctx.args.use_reloader: |
87 options['reload'] = True | 61 options['reload'] = True |
88 app_wrapper = PieCrustGunicornApplication(app, options) | 62 run_gunicorn_server( |
89 app_wrapper.run() | 63 root_dir, |
64 debug_piecrust=debug, | |
65 sub_cache_dir=ctx.app.sub_cache_dir, | |
66 gunicorn_options=options) | |
90 | 67 |