|
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 |