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
code@440
     1
from cPickle import loads, dumps
code@440
     2
code@438
     3
from django.contrib.sessions.backends.base import SessionBase, CreateError
code@440
     4
from django.conf import settings
code@440
     5
code@438
     6
import redis
code@438
     7
code@438
     8
class SessionStore(SessionBase):
code@438
     9
    """
code@438
    10
    A redis-based session store.
code@438
    11
    """
code@438
    12
    def __init__(self, session_key=None):
code@440
    13
        self.redis = redis.Redis(
code@440
    14
            host=getattr(settings, "REDIS_HOST", None),
code@440
    15
            port=getattr(settings, "REDIS_PORT", None),
code@440
    16
            timeout=getattr(settings, "REDIS_TIMEOUT", None),
code@440
    17
            db=getattr(settings, "REDIS_DB", None))
code@438
    18
        self.redis.connect()
code@438
    19
        super(SessionStore, self).__init__(session_key)
code@438
    20
code@438
    21
    def load(self):
code@439
    22
        session_data = self.redis.get(self.session_key)
code@438
    23
        if session_data is not None:
code@439
    24
            return loads(session_data)
code@438
    25
        self.create()
code@438
    26
        return {}
code@438
    27
code@438
    28
    def create(self):
code@438
    29
        while True:
code@438
    30
            self.session_key = self._get_new_session_key()
code@438
    31
            try:
code@438
    32
                self.save(must_create=True)
code@438
    33
            except CreateError:
code@441
    34
                # Would be raised if the key wasn't unique
code@438
    35
                continue
code@438
    36
            self.modified = True
code@438
    37
            return
code@438
    38
code@438
    39
    def save(self, must_create=False):
code@438
    40
        if must_create:
code@438
    41
            # preserve=True -> SETNX
code@438
    42
            result = self.redis.set(
code@438
    43
                self.session_key, dumps(self._get_session(no_load=must_create)), preserve=True)
code@441
    44
            if result == 0: # 0 == not created, 1 == created.
code@438
    45
                raise CreateError
code@438
    46
        else:
code@438
    47
            self.redis.set(self.session_key, dumps(self._get_session(no_load=must_create)),)
code@438
    48
code@438
    49
    def exists(self, session_key):
code@438
    50
        if self.redis.exists(session_key):
code@438
    51
            return True
code@438
    52
        return False
code@438
    53
code@438
    54
    def delete(self, session_key=None):
code@438
    55
        if session_key is None:
code@438
    56
            if self._session_key is None:
code@438
    57
                return
code@438
    58
            session_key = self._session_key
code@438
    59
        self.redis.delete(session_key)
code@438
    60