Skip to content

Commit

Permalink
add a SessionStore using Mongoengine
Browse files Browse the repository at this point in the history
  • Loading branch information
dcrosta committed Sep 14, 2011
1 parent 995d546 commit 12811ca
Showing 1 changed file with 40 additions and 0 deletions.
40 changes: 40 additions & 0 deletions flaskext/mongoengine/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

from flask import abort

from werkzeug.contrib.sessions import SessionStore


def _include_mongoengine(obj):
for module in mongoengine, mongoengine.fields:
Expand Down Expand Up @@ -236,3 +238,41 @@ def next(self, error_out=False):
'for this method to work'
return self.__class__(self.queryset, self.doc_id, self.field_name,
self.page + 1, self.per_page, self.total)

class MongoSessionStore(SessionStore):
"""Subclass of :class:`werkzeug.contrib.sessions.SessionStore`
which stores sessions using MongoDB documents.
"""

def __init__(self, db, collection='session'):
super(MongoSessionStore, self).__init__()

if not isinstance(collection, basestring):
raise ValueError('collection argument should be string or unicode')

class DBSession(db.Document):
sid = mongoengine.StringField(primary_key=True)
data = mongoengine.DictField()
meta = {
'allow_inheritance': False,
'collection': collection,
}

self.cls = DBSession

def save(self, session):
doc = self.cls(
sid=session.sid,
data=dict(session))
doc.save()

def delete(self, session):
self.cls.objects(sid=session.sid).delete()

def get(self, sid):
doc = self.cls.objects(sid=sid).first()
if doc:
return self.session_class(dict(doc.data), sid, False)
else:
return self.session_class({}, sid, True)

0 comments on commit 12811ca

Please sign in to comment.