Mercurial > piecrust2
annotate piecrust/admin/web.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 | 45ad976712ec |
children |
rev | line source |
---|---|
778
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import os.path |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import logging |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
812
diff
changeset
|
3 from flask import Flask |
778
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 logger = logging.getLogger(__name__) |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 |
935
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
894
diff
changeset
|
9 def create_foodtruck_app(extra_settings=None, url_prefix=None): |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
812
diff
changeset
|
10 from .blueprint import foodtruck_bp |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
812
diff
changeset
|
11 |
808
8f2d32f90095
admin: Don't have the static folder for the app collide with the blueprint's.
Ludovic Chabant <ludovic@chabant.com>
parents:
783
diff
changeset
|
12 app = Flask(__name__.split('.')[0], static_folder=None) |
778
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 app.config.from_object('piecrust.admin.settings') |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 if extra_settings: |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 app.config.update(extra_settings) |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 |
935
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
894
diff
changeset
|
17 root_dir = app.config.setdefault('FOODTRUCK_ROOT_DIR', os.getcwd()) |
778
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 |
894
ca357249a321
admin: Read an optional Flask-app configuration file.
Ludovic Chabant <ludovic@chabant.com>
parents:
886
diff
changeset
|
19 app.config.from_pyfile(os.path.join(root_dir, 'admin_app.cfg'), |
ca357249a321
admin: Read an optional Flask-app configuration file.
Ludovic Chabant <ludovic@chabant.com>
parents:
886
diff
changeset
|
20 silent=True) |
ca357249a321
admin: Read an optional Flask-app configuration file.
Ludovic Chabant <ludovic@chabant.com>
parents:
886
diff
changeset
|
21 app.config.from_envvar('FOODTRUCK_SETTINGS', silent=True) |
ca357249a321
admin: Read an optional Flask-app configuration file.
Ludovic Chabant <ludovic@chabant.com>
parents:
886
diff
changeset
|
22 |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
812
diff
changeset
|
23 # Setup logging/error handling. |
778
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 if app.config['DEBUG']: |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 l = logging.getLogger() |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 l.setLevel(logging.DEBUG) |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
812
diff
changeset
|
28 if not app.config['SECRET_KEY']: |
778
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 # If there's no secret key, create a temp one but mark the app as not |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 # correctly installed so it shows the installation information page. |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
812
diff
changeset
|
31 app.config['SECRET_KEY'] = 'temp-key' |
778
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 # Register extensions and blueprints. |
935
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
894
diff
changeset
|
34 app.register_blueprint(foodtruck_bp, url_prefix=url_prefix) |
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
894
diff
changeset
|
35 |
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
894
diff
changeset
|
36 # Debugging stuff |
958
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
37 if app.config.get('FOODTRUCK_DEBUG_404'): |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
38 @app.errorhandler(404) |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
39 def page_not_found(e): |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
958
diff
changeset
|
40 return _debug_page_not_found(app, e) |
778
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
812
diff
changeset
|
42 logger.debug("Created FoodTruck app with admin root: %s" % root_dir) |
778
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
43 |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 return app |
5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 |
958
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
46 |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
958
diff
changeset
|
47 def _debug_page_not_found(app, e): |
958
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
48 from flask import request, url_for |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
49 output = [] |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
50 for rule in app.url_map.iter_rules(): |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
51 options = {} |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
52 for arg in rule.arguments: |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
53 options[arg] = "[{0}]".format(arg) |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
54 methods = ','.join(rule.methods) |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
55 try: |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
56 url = url_for(rule.endpoint, **options) |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
57 except: |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
58 url = '???' |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
59 line = ("{:50s} {:20s} {}".format(rule.endpoint, methods, url)) |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
60 output.append(line) |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
61 |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
958
diff
changeset
|
62 resp = 'FOODTRUCK_ROOT_URL=%s<br/>\n' % str( |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
958
diff
changeset
|
63 app.config['FOODTRUCK_ROOT_URL']) |
958
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
64 resp += 'PATH=%s<br/>\n' % request.path |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
65 resp += 'ENVIRON=%s<br/>\n' % str(request.environ) |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
66 resp += 'URL RULES:<br/>\n' |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
67 resp += '<br/>\n'.join(sorted(output)) |
e1cadbfddb48
admin: Move 404 debugging into a separate function.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
68 return resp, 404 |