agdj/lib/redis_session_backend.py
author Adam Gomaa <adam@gomaa.us>
Tue Jan 31 05:51:56 2012 -0500
changeset 516 47f825fd00fa
parent 440 1b733a90ae3f
permissions -rw-r--r--
Fixing what I think are compat issues
     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                 self.save(must_create=True)
    33             except CreateError:
    34                 # Would be raised if the key wasn't unique
    35                 continue
    36             self.modified = True
    37             return
    38 
    39     def save(self, must_create=False):
    40         if must_create:
    41             # preserve=True -> SETNX
    42             result = self.redis.set(
    43                 self.session_key, dumps(self._get_session(no_load=must_create)), preserve=True)
    44             if result == 0: # 0 == not created, 1 == created.
    45                 raise CreateError
    46         else:
    47             self.redis.set(self.session_key, dumps(self._get_session(no_load=must_create)),)
    48 
    49     def exists(self, session_key):
    50         if self.redis.exists(session_key):
    51             return True
    52         return False
    53 
    54     def delete(self, session_key=None):
    55         if session_key is None:
    56             if self._session_key is None:
    57                 return
    58             session_key = self._session_key
    59         self.redis.delete(session_key)
    60