Chen Jian

导航

 
# -*- coding: utf-8 -*-
"""
Created on 09/11/2011
@author: Carlo Pires <carlopires@gmail.com>
"""
import tnetstring
from werkzeug.contrib.sessions import SessionStore
 
SESSION_TIMEOUT = 60*60*24*7 # 7 weeks in seconds
 
class RedisSessionStore(SessionStore):
"""
SessionStore that saves session to redis
"""
def __init__(self, redis, key_template='session:%s', generate_salt=None):
 
if not generate_salt:
from users import get_config
generate_salt = get_config().users_secret
 
SessionStore.__init__(self)
self.redis = redis
self.key_template = key_template
self.generate_salt = generate_salt
 
def new(self):
"""Generate a new session."""
return self.session_class({}, self.generate_key(self.generate_salt), True)
 
def get_session_key(self, sid):
if isinstance(sid, unicode):
sid = sid.encode('utf-8')
return self.key_template % sid
 
def save(self, session):
key = self.get_session_key(session.sid)
if self.redis.set(key, tnetstring.dumps(dict(session))):
return self.redis.expire(key, SESSION_TIMEOUT)
 
def delete(self, session):
key = self.get_session_key(session.sid)
return self.redis.delete(key)
 
def get(self, sid):
if not self.is_valid_key(sid):
return self.new()
key = self.get_session_key(sid)
saved = self.redis.get(key)
if saved:
data = tnetstring.loads(saved)
return self.session_class(data, sid, False)
 
def list(self):
"""
Lists all sessions in the store.
"""
session_keys = self.redis.keys(self.key_template[:-2] + '*')
return [s[len(self.key_template)-2:] for s in session_keys]
posted on 2014-01-23 16:43  Chen Jian  阅读(654)  评论(1编辑  收藏  举报