web/lib/django/contrib/sessions/backends/db.py
changeset 0 0d40e90630ef
child 29 cc9b7e14412b
equal deleted inserted replaced
-1:000000000000 0:0d40e90630ef
       
     1 import datetime
       
     2 from django.contrib.sessions.models import Session
       
     3 from django.contrib.sessions.backends.base import SessionBase, CreateError
       
     4 from django.core.exceptions import SuspiciousOperation
       
     5 from django.db import IntegrityError, transaction
       
     6 from django.utils.encoding import force_unicode
       
     7 
       
     8 class SessionStore(SessionBase):
       
     9     """
       
    10     Implements database session store.
       
    11     """
       
    12     def load(self):
       
    13         try:
       
    14             s = Session.objects.get(
       
    15                 session_key = self.session_key,
       
    16                 expire_date__gt=datetime.datetime.now()
       
    17             )
       
    18             return self.decode(force_unicode(s.session_data))
       
    19         except (Session.DoesNotExist, SuspiciousOperation):
       
    20             self.create()
       
    21             return {}
       
    22 
       
    23     def exists(self, session_key):
       
    24         try:
       
    25             Session.objects.get(session_key=session_key)
       
    26         except Session.DoesNotExist:
       
    27             return False
       
    28         return True
       
    29 
       
    30     def create(self):
       
    31         while True:
       
    32             self.session_key = self._get_new_session_key()
       
    33             try:
       
    34                 # Save immediately to ensure we have a unique entry in the
       
    35                 # database.
       
    36                 self.save(must_create=True)
       
    37             except CreateError:
       
    38                 # Key wasn't unique. Try again.
       
    39                 continue
       
    40             self.modified = True
       
    41             self._session_cache = {}
       
    42             return
       
    43 
       
    44     def save(self, must_create=False):
       
    45         """
       
    46         Saves the current session data to the database. If 'must_create' is
       
    47         True, a database error will be raised if the saving operation doesn't
       
    48         create a *new* entry (as opposed to possibly updating an existing
       
    49         entry).
       
    50         """
       
    51         obj = Session(
       
    52             session_key = self.session_key,
       
    53             session_data = self.encode(self._get_session(no_load=must_create)),
       
    54             expire_date = self.get_expiry_date()
       
    55         )
       
    56         sid = transaction.savepoint()
       
    57         try:
       
    58             obj.save(force_insert=must_create)
       
    59         except IntegrityError:
       
    60             if must_create:
       
    61                 transaction.savepoint_rollback(sid)
       
    62                 raise CreateError
       
    63             raise
       
    64 
       
    65     def delete(self, session_key=None):
       
    66         if session_key is None:
       
    67             if self._session_key is None:
       
    68                 return
       
    69             session_key = self._session_key
       
    70         try:
       
    71             Session.objects.get(session_key=session_key).delete()
       
    72         except Session.DoesNotExist:
       
    73             pass