comparison foodtruck/web.py @ 587:d4a01a023998

admin: Add "FoodTruck" admin panel from the side experiment project.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 16 Jan 2016 14:24:35 -0800
parents
children 79a31a3c947b
comparison
equal deleted inserted replaced
586:59268b4d8c71 587:d4a01a023998
1 import logging
2 from flask import Flask, g, request, render_template
3 from .config import (
4 FoodTruckConfigNotFoundError, get_foodtruck_config)
5 from .sites import FoodTruckSites
6
7
8 logger = logging.getLogger(__name__)
9
10 app = Flask(__name__)
11
12 c = get_foodtruck_config()
13 app.secret_key = c.get('foodtruck/secret_key')
14 del c
15
16
17 def after_this_request(f):
18 if not hasattr(g, 'after_request_callbacks'):
19 g.after_request_callbacks = []
20 g.after_request_callbacks.append(f)
21 return f
22
23
24 class LazySomething(object):
25 def __init__(self, factory):
26 self._factory = factory
27 self._something = None
28
29 def __getattr__(self, name):
30 if self._something is not None:
31 return getattr(self._something, name)
32
33 self._something = self._factory()
34 return getattr(self._something, name)
35
36
37 @app.before_request
38 def _setup_foodtruck_globals():
39 def _get_sites():
40 s = FoodTruckSites(g.config,
41 request.cookies.get('foodtruck_site_name'))
42 return s
43 g.config = LazySomething(get_foodtruck_config)
44 g.sites = LazySomething(_get_sites)
45
46
47 @app.after_request
48 def _call_after_request_callbacks(response):
49 for callback in getattr(g, 'after_request_callbacks', ()):
50 callback(response)
51 return response
52
53
54 @app.errorhandler(FoodTruckConfigNotFoundError)
55 def _on_config_missing(ex):
56 return render_template('install.html')
57
58
59 @app.errorhandler
60 def _on_error(ex):
61 logging.exception(ex)
62
63
64 from flask.ext.login import LoginManager, UserMixin
65
66
67 class User(UserMixin):
68 def __init__(self, uid, pwd):
69 self.id = uid
70 self.password = pwd
71
72
73 def load_user(user_id):
74 admin_id = g.config.get('security/username')
75 if admin_id == user_id:
76 admin_pwd = g.config.get('security/password')
77 return User(admin_id, admin_pwd)
78 return None
79
80
81 login_manager = LoginManager()
82 login_manager.init_app(app)
83 login_manager.login_view = 'login'
84 login_manager.user_loader(load_user)
85
86
87 try:
88 from flask.ext.bcrypt import Bcrypt
89 except ImportError:
90 logging.warning("Bcrypt not available... falling back to SHA512.")
91 logging.warning("Run `pip install Flask-Bcrypt` for more secure "
92 "password hashing.")
93
94 import hashlib
95
96 def generate_password_hash(password):
97 return hashlib.sha512(password.encode('utf8')).hexdigest()
98
99 def check_password_hash(reference, check):
100 check_hash = hashlib.sha512(check.encode('utf8')).hexdigest()
101 return check_hash == reference
102
103 class SHA512Fallback(object):
104 def __init__(self, app=None):
105 self.generate_password_hash = generate_password_hash
106 self.check_password_hash = check_password_hash
107
108 Bcrypt = SHA512Fallback
109
110 app.bcrypt = Bcrypt(app)
111
112
113 import foodtruck.views.baking # NOQA
114 import foodtruck.views.create # NOQA
115 import foodtruck.views.edit # NOQA
116 import foodtruck.views.main # NOQA
117 import foodtruck.views.menu # NOQA
118 import foodtruck.views.preview # NOQA
119 import foodtruck.views.settings # NOQA
120 import foodtruck.views.sources # NOQA
121