|
code@440
|
1 |
from cPickle import loads, dumps
|
|
code@440
|
2 |
|
|
code@438
|
3 |
from django.contrib.sessions.backends.base import SessionBase, CreateError
|
|
code@440
|
4 |
from django.conf import settings
|
|
code@440
|
5 |
|
|
code@438
|
6 |
import redis
|
|
code@438
|
7 |
|
|
code@438
|
8 |
class SessionStore(SessionBase):
|
|
code@438
|
9 |
"""
|
|
code@438
|
10 |
A redis-based session store.
|
|
code@438
|
11 |
"""
|
|
code@438
|
12 |
def __init__(self, session_key=None):
|
|
code@440
|
13 |
self.redis = redis.Redis(
|
|
code@440
|
14 |
host=getattr(settings, "REDIS_HOST", None),
|
|
code@440
|
15 |
port=getattr(settings, "REDIS_PORT", None),
|
|
code@440
|
16 |
timeout=getattr(settings, "REDIS_TIMEOUT", None),
|
|
code@440
|
17 |
db=getattr(settings, "REDIS_DB", None))
|
|
code@438
|
18 |
self.redis.connect()
|
|
code@438
|
19 |
super(SessionStore, self).__init__(session_key)
|
|
code@438
|
20 |
|
|
code@438
|
21 |
def load(self):
|
|
code@439
|
22 |
session_data = self.redis.get(self.session_key)
|
|
code@438
|
23 |
if session_data is not None:
|
|
code@439
|
24 |
return loads(session_data)
|
|
code@438
|
25 |
self.create()
|
|
code@438
|
26 |
return {}
|
|
code@438
|
27 |
|
|
code@438
|
28 |
def create(self):
|
|
code@438
|
29 |
while True:
|
|
code@438
|
30 |
self.session_key = self._get_new_session_key()
|
|
code@438
|
31 |
try:
|
|
code@438
|
32 |
self.save(must_create=True)
|
|
code@438
|
33 |
except CreateError:
|
|
code@441
|
34 |
# Would be raised if the key wasn't unique
|
|
code@438
|
35 |
continue
|
|
code@438
|
36 |
self.modified = True
|
|
code@438
|
37 |
return
|
|
code@438
|
38 |
|
|
code@438
|
39 |
def save(self, must_create=False):
|
|
code@438
|
40 |
if must_create:
|
|
code@438
|
41 |
# preserve=True -> SETNX
|
|
code@438
|
42 |
result = self.redis.set(
|
|
code@438
|
43 |
self.session_key, dumps(self._get_session(no_load=must_create)), preserve=True)
|
|
code@441
|
44 |
if result == 0: # 0 == not created, 1 == created.
|
|
code@438
|
45 |
raise CreateError
|
|
code@438
|
46 |
else:
|
|
code@438
|
47 |
self.redis.set(self.session_key, dumps(self._get_session(no_load=must_create)),)
|
|
code@438
|
48 |
|
|
code@438
|
49 |
def exists(self, session_key):
|
|
code@438
|
50 |
if self.redis.exists(session_key):
|
|
code@438
|
51 |
return True
|
|
code@438
|
52 |
return False
|
|
code@438
|
53 |
|
|
code@438
|
54 |
def delete(self, session_key=None):
|
|
code@438
|
55 |
if session_key is None:
|
|
code@438
|
56 |
if self._session_key is None:
|
|
code@438
|
57 |
return
|
|
code@438
|
58 |
session_key = self._session_key
|
|
code@438
|
59 |
self.redis.delete(session_key)
|
|
code@438
|
60 |
|