Package coprs :: Module redis_session
[hide private]
[frames] | no frames]

Source Code for Module coprs.redis_session

 1  # coding: utf-8 
 2   
 3  # taken from: http://flask.pocoo.org/snippets/75/ 
 4  # author: Armin Ronacher 
 5  # Public Domain 
 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   
16 -class RedisSession(CallbackDict, SessionMixin):
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
27 -class RedisSessionInterface(SessionInterface):
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
36 - def generate_sid(self):
37 return str(uuid4())
38
39 - def get_redis_expiration_time(self, app, session):
40 if session.permanent: 41 return app.permanent_session_lifetime 42 return timedelta(days=1)
43
44 - def open_session(self, app, request):
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
55 - def save_session(self, app, session, response):
56 # print("String session: {}".format(session)) 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