Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New Store mechanism to use with Google App Engine #223

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
39 changes: 39 additions & 0 deletions web/session.py
Expand Up @@ -352,6 +352,45 @@ def cleanup(self, timeout):
atime, v = self.shelf[k] atime, v = self.shelf[k]
if now - atime > timeout : if now - atime > timeout :
del self[k] del self[k]

try:
from google.appengine.ext import db

CLEANUP_BATCH_SIZE = 20

class WebpySession(db.Model):
"""Model used to save session data to Google App Engine DB"""
data = db.BlobProperty()
atime = db.DateTimeProperty(auto_now=True)

class GoogleStore(Store):
"""Google Datastore"""
def __init__(self, prefix="p"):
self.prefix=prefix

def __contains__(self, key):
return WebpySession.get_by_key_name(self.prefix+key) is not None

def __getitem__(self, key):
try:
return pickle.loads(WebpySession.get_by_key_name(self.prefix+key).data)
except AttributeError:
raise KeyError, key

def __setitem__(self, key, value):
r = WebpySession.get_or_insert(self.prefix+key)
r.data = pickle.dumps(value)
r.put()

def __delitem__(self, key):
try:
WebpySession.get_by_key_name(self.prefix+key).delete()
except AttributeError:
pass
def cleanup(self, timeout):
db.delete(WebpySession.all().filter('atime <', datetime.datetime.now()-datetime.timedelta(seconds=timeout)).fetch(CLEANUP_BATCH_SIZE))
except ImportError:
pass


if __name__ == '__main__' : if __name__ == '__main__' :
import doctest import doctest
Expand Down