· 9 years ago · Apr 26, 2016, 12:30 PM
1import threading
2from datetime import timedelta
3import time
4
5import flask
6from flask import Flask, Response, redirect, url_for, request, session, abort
7from flask.ext.login import LoginManager, UserMixin,
8 login_required, login_user, logout_user
9
10class ResettableTimer(threading.Timer):
11 """Call a function after a specified number of seconds:
12
13 t = Timer(30.0, f, args=None, kwargs=None)
14 t.start()
15 t.reset() # after starting, it reset the time back to 0
16 t.cancel() # stop the timer's action if it's still waiting
17
18
19 """
20
21 def __init__(self, interval, function, args=None, kwargs=None):
22 super().__init__(interval, function, args, kwargs)
23 self.daemon = True
24 self.time_to_wait_per_cycle = 0.3
25 self.time_to_wait = interval
26
27 def reset(self):
28 if not self.finished.is_set():
29 self.time_to_wait = self.interval
30
31 def run(self):
32 while self.time_to_wait > 0 and not self.finished.is_set():
33 s = time.perf_counter()
34 self.finished.wait(self.time_to_wait_per_cycle)
35 self.time_to_wait -= time.perf_counter() - s
36
37 if not self.finished.is_set():
38 self.function(*self.args, **self.kwargs)
39 self.finished.set()
40
41app = Flask(__name__)
42
43# config
44app.config.update(
45 DEBUG = True,
46 SECRET_KEY = 'secret_xxx'
47)
48
49# flask-login
50login_manager = LoginManager()
51login_manager.init_app(app)
52
53
54# silly user model
55class User(UserMixin):
56
57 def __init__(self, id):
58 self.id = id
59 self.name = "user" + str(id)
60 self.password = self.name + "_secret"
61
62 def __repr__(self):
63 return "%d/%s/%s" % (self.id, self.name, self.password)
64
65
66# create some users with ids 1 to 20
67users = [User(id) for id in range(1, 21)]
68
69# some protected url
70@app.route('/')
71@login_required
72def home():
73 return Response("Hello World!")
74
75@app.route("/foo")
76@login_required
77def foo():
78 try:
79 session['counter'] += 1
80 except Exception:
81 session['counter'] = 1
82 return Response("Hello world %d" % (session['counter'],))
83
84# somewhere to login
85@app.route("/login", methods=["GET", "POST"])
86def login():
87
88 user = User(1)
89 login_user(user)
90
91 @flask.copy_current_request_context
92 def auto_logout():
93 print("auto logout")
94 logout_user()
95 flask.session.clear()
96
97 auto_logout_timer = ResettableTimer(10, auto_logout)
98 auto_logout_timer.start()
99 return "<p>OK</p>", 200#redirect(request.args.get("next"))
100
101
102# somewhere to logout
103@app.route("/logout")
104@login_required
105def logout():
106 logout_user()
107 return Response('<p>Logged out</p>')
108
109
110# callback to reload the user object
111@login_manager.user_loader
112def load_user(userid):
113 return User(userid)
114
115
116if __name__ == "__main__":
117 app.run()