agdj/lib/redis_session_backend.py
author Adam Gomaa <code@adam.gomaa.us>
Wed May 06 13:31:09 2009 -0400
changeset 440 1b733a90ae3f
parent 439 291889d0664c
child 441 ff5392331342
permissions -rw-r--r--
Get kwargs for Redis() from the settings.
     1 from cPickle import loads, dumps
     2 
     3 from django.contrib.sessions.backends.base import SessionBase, CreateError
     4 from django.conf import settings
     5 
     6 import redis
     7 
     8 class SessionStore(SessionBase):
     9     """
    10     A redis-based session store.
    11     """
    12     def __init__(self, session_key=None):
    13         self.redis = redis.Redis(
    14             host=getattr(settings, "REDIS_HOST", None),
    15             port=getattr(settings, "REDIS_PORT", None),
    16             timeout=getattr(settings, "REDIS_TIMEOUT", None),
    17             db=getattr(settings, "REDIS_DB", None))
    18         self.redis.connect()
    19         super(SessionStore, self).__init__(session_key)
    20 
    21     def load(self):
    22         session_data = self.redis.get(self.session_key)
    23         if session_data is not None:
    24             return loads(session_data)
    25         self.create()
    26         return {}
    27 
    28     def create(self):
    29         while True:
    30             self.session_key = self._get_new_session_key()
    31             try:
    32                 # Save immediately to ensure we have a unique entry in the
    33                 # database.
    34                 self.save(must_create=True)
    35             except CreateError:
    36                 # Key wasn't unique. Try again.
    37                 continue
    38             self.modified = True
    39             return
    40 
    41     def save(self, must_create=False):
    42         if must_create:
    43             # preserve=True -> SETNX
    44             result = self.redis.set(
    45                 self.session_key, dumps(self._get_session(no_load=must_create)), preserve=True)
    46             if result == 0:
    47                 raise CreateError
    48         else:
    49             self.redis.set(self.session_key, dumps(self._get_session(no_load=must_create)),)
    50 
    51     def exists(self, session_key):
    52         if self.redis.exists(session_key):
    53             return True
    54         return False
    55 
    56     def delete(self, session_key=None):
    57         if session_key is None:
    58             if self._session_key is None:
    59                 return
    60             session_key = self._session_key
    61         self.redis.delete(session_key)
    62