1
2
3
4
5
6
7
8 import pickle
9 from datetime import timedelta
10 from uuid import uuid4
11 from redis import Redis
12 from werkzeug.datastructures import CallbackDict
13 from flask.sessions import SessionInterface, SessionMixin
14
15
17
18 - def __init__(self, initial=None, sid=None, new=False):
19 def on_update(self):
20 self.modified = True
21 CallbackDict.__init__(self, initial, on_update)
22 self.sid = sid
23 self.new = new
24 self.modified = False
25
26
28 serializer = pickle
29 session_class = RedisSession
30
31 - def __init__(self, redis=None, prefix='session:'):
32 if redis is None:
33 redis = Redis()
34 self.redis = redis
35 self.prefix = prefix
36
39
41 if session.permanent:
42 return app.permanent_session_lifetime
43 return timedelta(days=1)
44
46 sid = request.cookies.get(app.session_cookie_name)
47 if not sid:
48 sid = self.generate_sid()
49 return self.session_class(sid=sid, new=True)
50 val = self.redis.get(self.prefix + sid)
51 if val is not None:
52 data = self.serializer.loads(val)
53 return self.session_class(data, sid=sid)
54 return self.session_class(sid=sid, new=True)
55
57
58 domain = self.get_cookie_domain(app)
59 if not session:
60 self.redis.delete(self.prefix + session.sid)
61 if session.modified:
62 response.delete_cookie(app.session_cookie_name,
63 domain=domain)
64 return
65 redis_exp = self.get_redis_expiration_time(app, session)
66 cookie_exp = self.get_expiration_time(app, session)
67 val = self.serializer.dumps(dict(session))
68
69 time_exp = int(redis_exp.total_seconds())
70 key_exp = self.prefix + session.sid
71 if isinstance(self.redis, Redis):
72 self.redis.setex(key_exp, val, time_exp)
73 else:
74 self.redis.setex(key_exp, time_exp, val)
75
76 response.set_cookie(app.session_cookie_name, session.sid,
77 expires=cookie_exp, httponly=True,
78 domain=domain)
79