Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Aug 23rd, 2012  |  syntax: None  |  size: 2.35 KB  |  hits: 6  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. from django.contrib.sessions.backends.base import SessionBase, CreateError
  2. from django.conf import settings
  3. from django.utils.encoding import force_unicode
  4. import redis
  5.  
  6. class SessionStore(SessionBase):
  7.     """ Redis store for sessions"""
  8.  
  9.     def __init__(self, session_key=None):
  10.         self.redis = redis.Redis(
  11.             host = settings.SESSION_REDIS_HOST,
  12.             port = settings.SESSION_REDIS_PORT,
  13.             socket_timeout = settings.REDIS_SOCKET_TIMEOUT
  14.         )
  15.         super(SessionStore, self).__init__(session_key)
  16.  
  17.     @classmethod
  18.     def _get_key_for_redis(self, session_key):
  19.         return 'sessionstore:%s' % session_key
  20.  
  21.     def _redis_key(self):
  22.         return self.__class__._get_key_for_redis(self.session_key)
  23.  
  24.     def load(self):
  25.         session_data = self.redis.get(self._redis_key())
  26.         if session_data is not None:
  27.             return self.decode(force_unicode(session_data))
  28.         else:
  29.             self.create()
  30.             return {}
  31.  
  32.     def create(self):
  33.         max_attempts = 10
  34.         attempt = 0
  35.         while True:
  36.             self.session_key = self._get_new_session_key()
  37.             session_dict = self._get_session(no_load = True)
  38.             session_data = self.encode(session_dict)
  39.  
  40.             was_created = self.redis.setnx(self._redis_key(),
  41.                                            session_data)
  42.             if was_created:
  43.                 self.redis.expire(self._redis_key(),
  44.                                   settings.SESSION_COOKIE_AGE)
  45.                 self.modified = True
  46.                 self._session_cache = session_dict
  47.                 return
  48.             else:
  49.                 # extremely unlikely
  50.                 if attempt == max_attempts:
  51.                     raise CreateError
  52.                 else:
  53.                     attempt += 1
  54.                     continue
  55.  
  56.     def save(self, must_create=False):
  57.         if must_create:
  58.             self.create()
  59.         else:
  60.             encoded_data = self.encode(self._session)
  61.             self.redis.setex(self._redis_key(), encoded_data, settings.SESSION_COOKIE_AGE)
  62.  
  63.     def exists(self, session_key):
  64.         return self.redis.exists(self.__class__._get_key_for_redis(session_key))
  65.  
  66.     def delete(self, session_key=None):
  67.         to_delete = (session_key or self.session_key)
  68.         redis_key = self.__class__._get_key_for_redis(to_delete)
  69.         self.redis.delete(redis_key)