Django

Code

Ticket #6791: cached_db.diff

File cached_db.diff, 2.3 kB (added by jhenry <jhenry@theonion.com>, 8 months ago)
  • contrib/sessions/backends/cached_db.py

    old new  
     1from django.conf import settings 
     2from django.contrib.sessions.models import Session 
     3from django.contrib.sessions.backends.base import SessionBase 
     4from django.core.exceptions import SuspiciousOperation 
     5from django.core.cache import cache 
     6import datetime 
     7 
     8class SessionStore(SessionBase): 
     9    """ 
     10    Implements database session store 
     11    """ 
     12    def __init__(self, session_key=None): 
     13        super(SessionStore, self).__init__(session_key) 
     14 
     15    def _get_cache_key(self): 
     16        return 'django_session_backend_cache_%s' % (self.session_key) 
     17     
     18    def load(self): 
     19        try: 
     20            data = cache.get(self._get_cache_key(), None) 
     21            if data is None: 
     22                s = Session.objects.get( 
     23                    session_key = self.session_key,  
     24                    expire_date__gt=datetime.datetime.now() 
     25                    ) 
     26                data = self.decode(s.session_data) 
     27                cache.set(self._get_cache_key(), data, settings.SESSION_COOKIE_AGE) 
     28            return data 
     29        except (Session.DoesNotExist, SuspiciousOperation): 
     30            # Create a new session_key for extra security. 
     31            self.session_key = self._get_new_session_key() 
     32            self._session_cache = {} 
     33 
     34            # Save immediately to minimize collision 
     35            self.save() 
     36            return {} 
     37             
     38    def exists(self, session_key): 
     39        try: 
     40            Session.objects.get(session_key=session_key) 
     41        except Session.DoesNotExist: 
     42            return False 
     43        return True 
     44             
     45    def save(self): 
     46        cache.set(self._get_cache_key(), self._session, settings.SESSION_COOKIE_AGE) 
     47        Session.objects.create( 
     48            session_key = self.session_key, 
     49            session_data = self.encode(self._session), 
     50            expire_date = datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE)) 
     51     
     52    def delete(self, session_key): 
     53        try: 
     54            cache.delete(self._get_cache_key()) 
     55            Session.objects.get(session_key=session_key).delete() 
     56        except Session.DoesNotExist: 
     57            pass