annotate piecrust/serving/wrappers.py @ 1188:a7c43131d871

bake: Fix file write flushing problem with Python 3.8+ Writing the cache files fails in Python 3.8 because it looks like flushing behaviour has changed. We need to explicitly flush. And even then, in very rare occurrences, it looks like it can still run into racing conditions, so we do a very hacky and ugly "retry" loop when fetching cached data :(
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 15 Jun 2021 22:36:23 -0700
parents 587bccf72d75
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
374
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import os
558
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
2 import signal
552
9612cfc6455a serve: Rewrite of the Server-Sent Event code for build notifications.
Ludovic Chabant <ludovic@chabant.com>
parents: 374
diff changeset
3 import logging
9612cfc6455a serve: Rewrite of the Server-Sent Event code for build notifications.
Ludovic Chabant <ludovic@chabant.com>
parents: 374
diff changeset
4
9612cfc6455a serve: Rewrite of the Server-Sent Event code for build notifications.
Ludovic Chabant <ludovic@chabant.com>
parents: 374
diff changeset
5
9612cfc6455a serve: Rewrite of the Server-Sent Event code for build notifications.
Ludovic Chabant <ludovic@chabant.com>
parents: 374
diff changeset
6 logger = logging.getLogger(__name__)
374
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8
917
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
9 def run_piecrust_server(wsgi, appfactory, host, port,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
10 is_cmdline_mode=False,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
11 serve_admin=False,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
12 use_debugger=False,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
13 use_reloader=False):
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
14
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
15 if wsgi == 'werkzeug':
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
16 _run_werkzeug_server(appfactory, host, port,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
17 is_cmdline_mode=is_cmdline_mode,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
18 serve_admin=serve_admin,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
19 use_debugger=use_debugger,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
20 use_reloader=use_reloader)
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
21
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
22 elif wsgi == 'gunicorn':
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
23 options = {
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
24 'bind': '%s:%s' % (host, port),
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
25 'accesslog': '-', # print access log to stderr
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
26 }
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
27 if use_debugger:
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
28 options['loglevel'] = 'debug'
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
29 if use_reloader:
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
30 options['reload'] = True
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
31 _run_gunicorn_server(appfactory,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
32 is_cmdline_mode=is_cmdline_mode,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
33 gunicorn_options=options)
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
34
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
35 else:
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
36 raise Exception("Unknown WSGI server: %s" % wsgi)
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
37
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
38
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
39 def _run_werkzeug_server(appfactory, host, port, *,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
40 is_cmdline_mode=False,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
41 serve_admin=False,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
42 use_debugger=False,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
43 use_reloader=False):
374
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 from werkzeug.serving import run_simple
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 def _run_sse_check():
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 # We don't want to run the processing loop here if this isn't
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 # the actual process that does the serving. In most cases it is,
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 # but if we're using Werkzeug's reloader, then it won't be the
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 # first time we get there... it will only be the correct process
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 # the second time, when the reloading process is spawned, with the
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 # `WERKZEUG_RUN_MAIN` variable set.
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 return (not use_reloader or
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 os.environ.get('WERKZEUG_RUN_MAIN') == 'true')
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
56 app = _get_piecrust_server(appfactory,
917
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
57 is_cmdline_mode=is_cmdline_mode,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
58 serve_site=True,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
59 serve_admin=serve_admin,
374
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 run_sse_check=_run_sse_check)
552
9612cfc6455a serve: Rewrite of the Server-Sent Event code for build notifications.
Ludovic Chabant <ludovic@chabant.com>
parents: 374
diff changeset
61
558
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
62 # We need to do a few things to get Werkzeug to properly shutdown or
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
63 # restart while SSE responses are running. This is because Werkzeug runs
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
64 # them in background threads (because we tell it to), but those threads
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
65 # are not marked as "daemon", so when the main thread tries to exit, it
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
66 # will wait on those SSE responses to end, which will pretty much never
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
67 # happen (except for a timeout or the user closing their browser).
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
68 #
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
69 # In theory we should be using a proper async server for this kind of
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
70 # stuff, but I'd rather avoid additional dependencies on stuff that's not
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
71 # necessarily super portable.
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
72 #
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
73 # Anyway, we run the server as usual, but we intercept the `SIGINT`
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
74 # signal for when the user presses `CTRL-C`. When that happens, we set a
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
75 # flag that will make all existing SSE loops return, which will make it
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
76 # possible for the main thread to end too.
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
77 #
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
78 # We also need to do a few thing for the "reloading" feature in Werkzeug,
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
79 # see the comment down there for more info.
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
80 def _shutdown_server():
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
81 from piecrust.serving import procloop
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
82 procloop.server_shutdown = True
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
83
917
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
84 if serve_admin:
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
85 from piecrust.admin import pubutil
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
86 pubutil.server_shutdown = True
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
87
558
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
88 def _shutdown_server_and_raise_sigint():
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
89 if not use_reloader or os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
90 # We only need to shutdown the SSE requests for the process
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
91 # that actually runs them.
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
92 print("")
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
93 print("Shutting server down...")
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
94 _shutdown_server()
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
95 raise KeyboardInterrupt()
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
96
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
97 signal.signal(signal.SIGINT,
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
98 lambda *args: _shutdown_server_and_raise_sigint())
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
99
865
1bb0d973dc69 serve: Disable Werkzeug's debugger PIN.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
100 # Disable debugger PIN protection.
1bb0d973dc69 serve: Disable Werkzeug's debugger PIN.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
101 os.environ['WERKZEUG_DEBUG_PIN'] = 'off'
1bb0d973dc69 serve: Disable Werkzeug's debugger PIN.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
102
1122
587bccf72d75 serve: Only tell about the admin panel if needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 1117
diff changeset
103 if is_cmdline_mode and serve_admin:
1117
e8511fed42a3 serve: Indicate where to find the admin panel in the console output.
Ludovic Chabant <ludovic@chabant.com>
parents: 1109
diff changeset
104 admin_url = 'http://%s:%s%s' % (host, port, '/pc-admin')
e8511fed42a3 serve: Indicate where to find the admin panel in the console output.
Ludovic Chabant <ludovic@chabant.com>
parents: 1109
diff changeset
105 logger.info("The administrative panel is available at: %s" %
e8511fed42a3 serve: Indicate where to find the admin panel in the console output.
Ludovic Chabant <ludovic@chabant.com>
parents: 1109
diff changeset
106 admin_url)
e8511fed42a3 serve: Indicate where to find the admin panel in the console output.
Ludovic Chabant <ludovic@chabant.com>
parents: 1109
diff changeset
107
558
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
108 try:
374
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109 run_simple(host, port, app,
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 threaded=True,
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 use_debugger=use_debugger,
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 use_reloader=use_reloader)
558
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
113 except SystemExit:
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
114 if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
115 # When using the reloader, if code has changed, the child process
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
116 # will use `sys.exit` to end and let the master process restart
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
117 # it... we need to shutdown the SSE requests otherwise it will
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
118 # not exit.
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
119 _shutdown_server()
9ab005db2592 serve: Improve reloading and shutdown of the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 553
diff changeset
120 raise
374
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122
917
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
123 def _run_gunicorn_server(appfactory,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
124 is_cmdline_mode=False,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
125 gunicorn_options=None):
374
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 from gunicorn.app.base import BaseApplication
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128 class PieCrustGunicornApplication(BaseApplication):
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
129 def __init__(self, app, options):
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130 self.app = app
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
131 self.options = options
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
132 super(PieCrustGunicornApplication, self).__init__()
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
133
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134 def load_config(self):
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135 for k, v in self.options.items():
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136 if k in self.cfg.settings and v is not None:
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 self.cfg.set(k, v)
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
138
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139 def load(self):
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140 return self.app
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
141
917
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
142 app = _get_piecrust_server(appfactory,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
143 is_cmdline_mode=is_cmdline_mode)
374
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
144
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
145 gunicorn_options = gunicorn_options or {}
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146 app_wrapper = PieCrustGunicornApplication(app, gunicorn_options)
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147 app_wrapper.run()
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
148
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
149
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
150 def get_piecrust_server(root_dir, *,
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
151 debug=False,
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
152 cache_key=None,
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
153 serve_site=True,
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
154 serve_admin=False,
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
155 is_cmdline_mode=False):
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
156 from piecrust.app import PieCrustFactory
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
157 appfactory = PieCrustFactory(root_dir,
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
158 debug=debug,
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
159 cache_key=cache_key)
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
160 return _get_piecrust_server(appfactory,
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
161 serve_site=serve_site,
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
162 serve_admin=serve_admin,
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
163 is_cmdline_mode=is_cmdline_mode)
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
164
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
165
917
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
166 def _get_piecrust_server(appfactory, *,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
167 serve_site=True,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
168 serve_admin=False,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
169 is_cmdline_mode=False,
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
170 run_sse_check=None):
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
171 app = None
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
172
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
173 if serve_site:
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
174 from piecrust.serving.middlewares import (
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
175 PieCrustStaticResourcesMiddleware, PieCrustDebugMiddleware)
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
176 from piecrust.serving.server import PieCrustServer
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
177
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
178 app = PieCrustServer(appfactory)
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
179 app = PieCrustStaticResourcesMiddleware(app)
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
180
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
181 if is_cmdline_mode:
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
182 app = PieCrustDebugMiddleware(
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
183 app, appfactory, run_sse_check=run_sse_check)
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
184
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
185 if serve_admin:
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
186 from piecrust.admin.web import create_foodtruck_app
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
187
1109
6f26e83dfced admin: Fix another root URL issue for the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 1068
diff changeset
188 admin_root_url = ('/pc-admin' if is_cmdline_mode else None)
1068
137c9b41edd2 serve: Fix crash with `serve --admin`.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
189
917
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
190 es = {
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
191 'FOODTRUCK_CMDLINE_MODE': is_cmdline_mode,
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
192 'FOODTRUCK_ROOT_DIR': appfactory.root_dir,
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
193 'FOODTRUCK_ROOT_URL': admin_root_url,
917
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
194 'DEBUG': appfactory.debug}
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
195 if is_cmdline_mode:
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
196 es.update({
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
197 'SECRET_KEY': os.urandom(22),
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
198 'LOGIN_DISABLED': True})
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
199
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
200 if appfactory.debug and is_cmdline_mode:
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
201 # Disable PIN protection with Werkzeug's debugger.
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
202 os.environ['WERKZEUG_DEBUG_PIN'] = 'off'
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
203
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
204 admin_app = create_foodtruck_app(es, url_prefix=admin_root_url)
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
205 if app is not None:
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
206 admin_app.wsgi_app = _PieCrustSiteOrAdminMiddleware(
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
207 app, admin_app.wsgi_app, admin_root_url)
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
208
917
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
209 app = admin_app
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
210
374
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
211 return app
fa3ee8a8ee2d serve: Split the server code in a couple modules inside a `serving` package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
212
917
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
213
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
214 class _PieCrustSiteOrAdminMiddleware:
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
215 def __init__(self, main_app, admin_app, admin_root_url):
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
216 from werkzeug.exceptions import abort
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
217
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
218 def _err_resp(e, sr):
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
219 abort(404)
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
220
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
221 self.main_app = main_app
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
222 self.admin_app = admin_app or _err_resp
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
223 self.admin_root_url = admin_root_url
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
224
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
225 def __call__(self, environ, start_response):
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
226 path_info = environ.get('PATH_INFO', '')
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
227 if path_info.startswith(self.admin_root_url):
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
228 return self.admin_app(environ, start_response)
33a89139c284 serve: Add `--admin` option to run the administration panel.
Ludovic Chabant <ludovic@chabant.com>
parents: 865
diff changeset
229 return self.main_app(environ, start_response)
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
230
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
231
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
232 class _PieCrustAdminScriptNamePatcherMiddleware:
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
233 def __init__(self, admin_app, admin_root_url):
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
234 self.admin_app = admin_app
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
235 self.admin_root_url = '/%s' % admin_root_url.strip('/')
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
236
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
237 def __call__(self, environ, start_response):
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
238 environ['SCRIPT_NAME'] = self.admin_root_url
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 917
diff changeset
239 return self.admin_app(environ, start_response)