5 changed files with 86 additions and 21 deletions
@ -0,0 +1,73 @@ |
|||
import cherrypy |
|||
from photoapp.types import Base |
|||
from sqlalchemy import Column, String, DateTime, Boolean, BLOB |
|||
|
|||
try: |
|||
import cPickle as pickle |
|||
except ImportError: |
|||
import pickle |
|||
|
|||
|
|||
class Session(Base): |
|||
__tablename__ = 'sessions' |
|||
session_id = Column(String(128), nullable=False, primary_key=True) |
|||
# user_id = Column(Integer, ForeignKey('users.user_id')) |
|||
expiration = Column(DateTime, nullable=False) |
|||
data = Column(BLOB) |
|||
is_valid = Column(Boolean, default=True, nullable=False) |
|||
|
|||
|
|||
class DatabaseSession(cherrypy.lib.sessions.Session): |
|||
""" |
|||
Sqlalchemy-backed backed for session storage. Note that we don't implement any of the locking methods because the |
|||
underlying database connection is being uses transaction anyway, which would prevent concurrent updates. |
|||
""" |
|||
@classmethod |
|||
def setup(cls, **kwargs): |
|||
for k, v in kwargs.items(): |
|||
setattr(cls, k, v) |
|||
|
|||
cls.cached = None |
|||
|
|||
def _exists(self): |
|||
if not self.cached: |
|||
self._load() |
|||
return bool(self.cached) |
|||
|
|||
def _load(self): |
|||
if not self.cached: |
|||
self.cached = cherrypy.request.db.query(Session).filter(Session.session_id == self.id). \ |
|||
with_for_update().first() |
|||
|
|||
if self.cached: |
|||
return pickle.loads(self.cached.data) |
|||
|
|||
return None |
|||
|
|||
def _save(self, expiration_time): |
|||
data = pickle.dumps( |
|||
(self._data, expiration_time), |
|||
pickle.HIGHEST_PROTOCOL) |
|||
|
|||
if not self.cached: |
|||
self.cached = Session(session_id=self.id, |
|||
expiration=expiration_time) |
|||
cherrypy.request.db.add(self.cached) |
|||
|
|||
self.cached.data = data |
|||
|
|||
def _delete(self): |
|||
if not self.cached: |
|||
self._load() |
|||
|
|||
if self.cached: |
|||
cherrypy.request.db.delete(self.cached) |
|||
|
|||
def acquire_lock(self): |
|||
pass |
|||
|
|||
def release_lock(self): |
|||
pass |
|||
|
|||
def clean_up(self): |
|||
pass #TODO |
Write
Preview
Loading…
Cancel
Save
Reference in new issue