Skip to content

Instantly share code, notes, and snippets.

@jeffery9
Forked from carlopires/redis_session_store.py
Created May 15, 2016 12:19
Show Gist options
  • Save jeffery9/9abc66646ad76e5e3d993f1af3fb25d9 to your computer and use it in GitHub Desktop.
Save jeffery9/9abc66646ad76e5e3d993f1af3fb25d9 to your computer and use it in GitHub Desktop.
Werkzeug Redis Session Store
# -*- 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]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment