This repository has been archived on 2018-06-04. You can view files and clone it, but cannot push or open issues/pull-requests.
cassandra-sessions/cassandra_sessions/__init__.py

105 lines
3.6 KiB
Python

import lazyboy
import time
import logging
from lazyboy.key import Key
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.utils.encoding import force_unicode
from django.contrib.sessions.backends.base import SessionBase, CreateError
CASSANDRA_POOL = getattr(settings, 'CASSANDRA_POOL', None)
CASSANDRA_SESSION_KEYSPACE = getattr(settings, 'CASSANDRA_SESSION_KEYSPACE', None)
if CASSANDRA_POOL is None or CASSANDRA_SESSION_KEYSPACE is None:
raise ImproperlyConfigured(u'To use cassandra-sessions, you must first set the CASSANDRA_SESSION_KEYSPACE and CASSANDRA_POOL settings in your settings.py')
else:
try:
lazyboy.connection.get_pool(CASSANDRA_SESSION_KEYSPACE)
except lazyboy.exceptions.ErrorCassandraClientNotFound:
lazyboy.connection.add_pool(CASSANDRA_SESSION_KEYSPACE, CASSANDRA_POOL)
class SessionStore(SessionBase):
"""
A Cassandra-based session store.
"""
def get_session(self, session_key):
logging.debug('Getting session: %s' % session_key)
session = None
if session_key:
try:
key = Key(
keyspace=CASSANDRA_SESSION_KEYSPACE,
column_family="Sessions",
key=session_key
)
record = lazyboy.record.Record()
session_record = record.load(key)
session_values = session_record.values()
if session_values:
session = session_values[0]
except lazyboy.exceptions.ErrorNoSuchRecord:
pass
return session
def load(self):
session_data = self.get_session(self.session_key)
if session_data is not None:
expiry, data = int(session_data[:15]), session_data[15:]
if expiry < time.time():
return {}
else:
return self.decode(force_unicode(data))
self.create()
return {}
def create(self):
while True:
self.session_key = self._get_new_session_key()
try:
self.save()
except CreateError:
continue
self.modified = True
return
def save(self, must_create=True):
data = self.encode(self._get_session(no_load=True))
encoded = '%15d%s' % (int(time.time()) + self.get_expiry_age(), data)
key = Key(
keyspace=CASSANDRA_SESSION_KEYSPACE,
column_family="Sessions",
key=self.session_key
)
record = lazyboy.record.Record()
record.key = key
record[self.session_key] = encoded
record.save()
def exists(self, session_key):
session_data = self.get_session(session_key)
if session_data is not None:
expiry, data = int(session_data[:15]), session_data[15:]
if expiry < time.time():
return False
else:
return True
return False
def delete(self, session_key=None):
if session_key is None:
if self._session_key is None:
return
session_key = self._session_key
key = Key(
keyspace=CASSANDRA_SESSION_KEYSPACE,
column_family="Sessions",
key=session_key
)
# make this session expire right now
data = self.encode({})
encoded = '%15d%s' % (int(time.time()), data)
record = lazyboy.record.Record()
record.key = key
record[self.session_key] = encoded
record.save()