summaryrefslogtreecommitdiffstats
path: root/webapp/django/contrib/sessions/backends/db.py
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/django/contrib/sessions/backends/db.py')
-rw-r--r--webapp/django/contrib/sessions/backends/db.py73
1 files changed, 73 insertions, 0 deletions
diff --git a/webapp/django/contrib/sessions/backends/db.py b/webapp/django/contrib/sessions/backends/db.py
new file mode 100644
index 0000000000..85c4a0dd3c
--- /dev/null
+++ b/webapp/django/contrib/sessions/backends/db.py
@@ -0,0 +1,73 @@
+import datetime
+from django.contrib.sessions.models import Session
+from django.contrib.sessions.backends.base import SessionBase, CreateError
+from django.core.exceptions import SuspiciousOperation
+from django.db import IntegrityError, transaction
+from django.utils.encoding import force_unicode
+
+class SessionStore(SessionBase):
+ """
+ Implements database session store.
+ """
+ def load(self):
+ try:
+ s = Session.objects.get(
+ session_key = self.session_key,
+ expire_date__gt=datetime.datetime.now()
+ )
+ return self.decode(force_unicode(s.session_data))
+ except (Session.DoesNotExist, SuspiciousOperation):
+ self.create()
+ return {}
+
+ def exists(self, session_key):
+ try:
+ Session.objects.get(session_key=session_key)
+ except Session.DoesNotExist:
+ return False
+ return True
+
+ def create(self):
+ while True:
+ self.session_key = self._get_new_session_key()
+ try:
+ # Save immediately to ensure we have a unique entry in the
+ # database.
+ self.save(must_create=True)
+ except CreateError:
+ # Key wasn't unique. Try again.
+ continue
+ self.modified = True
+ self._session_cache = {}
+ return
+
+ def save(self, must_create=False):
+ """
+ Saves the current session data to the database. If 'must_create' is
+ True, a database error will be raised if the saving operation doesn't
+ create a *new* entry (as opposed to possibly updating an existing
+ entry).
+ """
+ obj = Session(
+ session_key = self.session_key,
+ session_data = self.encode(self._get_session(no_load=must_create)),
+ expire_date = self.get_expiry_date()
+ )
+ sid = transaction.savepoint()
+ try:
+ obj.save(force_insert=must_create)
+ except IntegrityError:
+ if must_create:
+ transaction.savepoint_rollback(sid)
+ raise CreateError
+ raise
+
+ def delete(self, session_key=None):
+ if session_key is None:
+ if self._session_key is None:
+ return
+ session_key = self._session_key
+ try:
+ Session.objects.get(session_key=session_key).delete()
+ except Session.DoesNotExist:
+ pass