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 Redis 
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=None, prefix='session:'):
32 if redis is None: 33 redis = Redis() 34 self.redis = redis 35 self.prefix = prefix
36
37 - def generate_sid(self):
38 return str(uuid4())
39
40 - def get_redis_expiration_time(self, app, session):
41 if session.permanent: 42 return app.permanent_session_lifetime 43 return timedelta(days=1)
44
45 - def open_session(self, app, request):
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
56 - def save_session(self, app, session, response):
57 # print("String session: {}".format(session)) 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