Mercurial > piecrust2
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 |