Toto 1.0.10 documentation

toto.redisconnection

Contents

Source code for toto.redisconnection

import redis
from toto.exceptions import *
from toto.session import *
from time import time
from datetime import datetime
from dbconnection import DBConnection
import base64
import uuid

def _account_key(user_id):
  return 'account:%s' % user_id

def _session_key(session_id):
  return 'session:%s' % session_id

class RedisSession(TotoSession):
  _account = None

  class RedisAccount(TotoAccount):
    def _load_property(self, *args):
      return dict(zip(args, self._session._db.hmget(_account_key(self._session.user_id), args)))

    def _save_property(self, *args):
      self._session._db.hmset(_account_key(self._session.user_id), {k: self[k] for k in args})

  def get_account(self):
    if not self._account:
      self._account = RedisSession.RedisAccount(self)
    return self._account

  def refresh(self):
    session_data = self._refresh_cache() or TotoSession.loads(self._db.get(_session_key(self.session_id)))
    self.__init__(self._db, session_data, self._session_cache)

  def save(self):
    if not self._save_cache():
      self._db.setex(_session_key(self.session_id), int(self.expires - time()), TotoSession.dumps(self.session_data()))

class RedisConnection(DBConnection):

  def __init__(self, host='localhost', port=6379, database=0):
    super(RedisConnection, self).__init__(*args, **kwargs)
    self.db = redis.StrictRedis(host=host, port=port, db=database)

  def _store_session(self, session_id, session_data):
    session_key = _session_key(session_id)
    self.db.setex(session_key, int(float(session_data['expires']) - time()), TotoSession.dumps(session_data))

  def _update_password(self, user_id, account, hashed_password):
    account_key = _account_key(user_id)
    self.db.hset(account_key, 'password', hashed_password)

  def _instantiate_session(self, session_data, session_cache):
    return RedisSession(self.db, session_data, self._session_cache)

  def _get_account(self, user_id):
    return self.db.hmget(account_key, 'user_id', 'password')

  def _store_account(self, user_id, values):
    account_key = _account_key(user_id)
    self.db.hmset(account_key, values)

  def _load_uncached_data(self, session_id):
    data = self.db.get(_session_key(session_id))
    if data:
      return TotoSession.loads(data)
    return None

  def _remove_session(self, session_id):
    session_key = _session_key(session_id)
    self.db.delete(session_key)

[docs]class RedisSessionCache(TotoSessionCache): '''A ``TotoSessionCache`` implementation that uses Redis for session storage. Useful for improving the speed of authenticated requests while still allowing account data to live in e.g. MySQL. ``db`` must be an instance of ``redis.StrictRedis`` initialized to the target database. ''' def __init__(self, db): self.db = db def store_session(self, session_data): session_key = _session_key(session_data['session_id']) self.db.setex(session_key, int(session_data['expires'] - time()), TotoSession.dumps(session_data)) def load_session(self, session_id): session_key = _session_key(session_id) session_data = self.db.get(session_key) if not session_data: return None else: return TotoSession.loads(session_data) def remove_session(self, session_id): session_key = _session_key(session_id) self.db.delete(session_key)

Contents