· 4 years ago · Jan 08, 2021, 01:42 PM
1# -*- coding: utf-8 -*-
2
3from flask import Flask, Response, redirect, url_for, request, session, abort
4from flask_login import LoginManager, UserMixin, login_required, login_user, logout_user
5from pony import orm
6from pony.flask import Pony
7from uuid import uuid4, UUID
8import matplotlib.pyplot as plt, mpld3
9
10app = Flask(__name__)
11Pony(app)
12
13# config
14app.config.update(
15 DEBUG = True,
16 SECRET_KEY = 'secret_xxx'
17)
18orm.set_sql_debug(False)
19
20##
21# Set up database
22###############################################################################
23db = orm.Database()
24#db.bind(provider='sqlite', filename='db.sqlite', create_db=True)
25db.bind(provider='sqlite', filename=':memory:', create_db=True)
26
27class Team(db.Entity):
28 id = orm.PrimaryKey(UUID)
29 name = orm.Required(str)
30 user = orm.Set('User')
31
32class User(db.Entity, UserMixin):
33 name = orm.Optional(str, default="")
34 username = orm.Required(str, unique=True)
35 password = orm.Required(str)
36 team = orm.Required(Team)
37 data = orm.Optional(orm.FloatArray)
38 times = orm.Optional(orm.IntArray)
39
40 def __repr__(self):
41 return "{}/{}/{}".format(self.id, self.name, self.password)
42
43db.generate_mapping(create_tables=True)
44
45##
46# flask-login
47###############################################################################
48login_manager = LoginManager()
49login_manager.init_app(app)
50login_manager.login_view = "login"
51
52##
53# temp init during development
54###############################################################################
55# with orm.db_session():
56# t = Team(id=uuid4(),
57# name="The team")
58# orm.commit()
59# for id in range(1, 21):
60# User(username = f"u{id}",
61# name = f"user{id}",
62# password = f"{id}",
63# team = t)
64
65##
66# Functions
67###############################################################################
68@orm.db_session
69def authenticate(username, password):
70 u = User.get(username = username,
71 password = password)
72 return u
73
74##
75# Routing
76###############################################################################
77@app.route('/')
78@login_required
79def home():
80 return Response('<p>Hello World!<p><a href="/logout">Logout</a>')
81
82# somewhere to login
83@app.route("/login", methods=["GET", "POST"])
84def login():
85 if request.method == 'POST':
86 username = request.form['username']
87 password = request.form['password']
88# if password == username + "_secret":
89 user = authenticate(username, password)
90 if user is not None:
91 login_user(user)
92 return redirect(request.args.get("next"))
93 else:
94 return abort(401)
95 else:
96 return Response('''
97 <form action="" method="post">
98 <p>username: <input type="text" name="username" />
99 <p>password: <input type="password" name="password" />
100 <p><input type="submit" value="Login" />
101 </form>
102 ''')
103
104# somewhere to logout
105@app.route("/logout")
106@login_required
107def logout():
108 logout_user()
109 return Response('<p>Logged out</p>')
110
111# handle login failed
112@app.errorhandler(401)
113def page_not_found(e):
114 return Response('<p>Login failed</p>')
115
116# callback to reload the user object
117@login_manager.user_loader
118def load_user(userid):
119 return User.get(id=userid)
120
121##
122# runtime
123###############################################################################
124if __name__ == "__main__":
125 app.run()
126