1
2
3
4
5
6
7
8 import pickle
9 from datetime import timedelta
10 from uuid import uuid4
11 from redis import StrictRedis
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, prefix='session:'):
32 assert isinstance(redis, StrictRedis)
33 self.redis = redis
34 self.prefix = prefix
35
38
40 if session.permanent:
41 return app.permanent_session_lifetime
42 return timedelta(days=1)
43
45 sid = request.cookies.get(app.session_cookie_name)
46 if not sid:
47 sid = self.generate_sid()
48 return self.session_class(sid=sid, new=True)
49 val = self.redis.get(self.prefix + sid)
50 if val is not None:
51 data = self.serializer.loads(val)
52 return self.session_class(data, sid=sid)
53 return self.session_class(sid=sid, new=True)
54
56
57 domain = self.get_cookie_domain(app)
58 if not session:
59 self.redis.delete(self.prefix + session.sid)
60 if session.modified:
61 response.delete_cookie(app.session_cookie_name,
62 domain=domain)
63 return
64 redis_exp = self.get_redis_expiration_time(app, session)
65 cookie_exp = self.get_expiration_time(app, session)
66 val = self.serializer.dumps(dict(session))
67
68 time_exp = int(redis_exp.total_seconds())
69 key_exp = self.prefix + session.sid
70 self.redis.setex(key_exp, time_exp, val)
71
72 response.set_cookie(app.session_cookie_name, session.sid,
73 expires=cookie_exp, httponly=True,
74 domain=domain)
75