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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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