diff foodtruck/web.py @ 597:79a31a3c947b

admin: Better production config for FoodTruck, provide proper first site. * Use a `settings` object to configure Flask. * Accept an `app.cfg` file in the admin folder to configure Flask. * Get a proper first site name when the cookie isn't set yet.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 20 Jan 2016 21:39:18 -0800
parents d4a01a023998
children effbc78b5528
line wrap: on
line diff
--- a/foodtruck/web.py	Wed Jan 20 21:36:51 2016 -0800
+++ b/foodtruck/web.py	Wed Jan 20 21:39:18 2016 -0800
@@ -1,3 +1,5 @@
+import os
+import os.path
 import logging
 from flask import Flask, g, request, render_template
 from .config import (
@@ -8,10 +10,19 @@
 logger = logging.getLogger(__name__)
 
 app = Flask(__name__)
+app.config.from_object('foodtruck.settings')
+app.config.from_envvar('FOODTRUCK_SETTINGS', silent=True)
 
-c = get_foodtruck_config()
-app.secret_key = c.get('foodtruck/secret_key')
-del c
+admin_root = app.config['FOODTRUCK_ROOT'] or os.getcwd()
+config_path = os.path.join(admin_root, 'app.cfg')
+if os.path.isfile(config_path):
+    app.config.from_pyfile(config_path)
+
+if app.config['DEBUG']:
+    l = logging.getLogger()
+    l.setLevel(logging.DEBUG)
+
+app.logger.debug("Using FoodTruck admin root: %s" % admin_root)
 
 
 def after_this_request(f):
@@ -36,11 +47,20 @@
 
 @app.before_request
 def _setup_foodtruck_globals():
+    def _get_config():
+        return get_foodtruck_config(admin_root)
+
     def _get_sites():
-        s = FoodTruckSites(g.config,
-                           request.cookies.get('foodtruck_site_name'))
+        current = request.cookies.get('foodtruck_site_name')
+        if current is None:
+            names = g.config.get('sites')
+            if not names or not isinstance(names, dict):
+                raise FoodTruckConfigNotFoundError()
+            current = next(iter(names.keys()))
+        s = FoodTruckSites(g.config, current)
         return s
-    g.config = LazySomething(get_foodtruck_config)
+
+    g.config = LazySomething(_get_config)
     g.sites = LazySomething(_get_sites)