From 484bc1e6f09aeff1f2628a6e5d259623eabf16ea Mon Sep 17 00:00:00 2001 From: Harry Marr Date: Mon, 11 Jan 2010 04:43:17 +0000 Subject: [PATCH] Added a MongoEngine backend for Django sessions --- docs/django.rst | 13 +++++++ mongoengine/django/sessions.py | 63 ++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 mongoengine/django/sessions.py diff --git a/docs/django.rst b/docs/django.rst index 57684365..d2c468a2 100644 --- a/docs/django.rst +++ b/docs/django.rst @@ -27,3 +27,16 @@ file:: The :mod:`~mongoengine.django.auth` module also contains a :func:`~mongoengine.django.auth.get_user` helper function, that takes a user's :attr:`id` and returns a :class:`~mongoengine.django.auth.User` object. + +Sessions +======== +Django allows the use of different backend stores for its sessions. MongoEngine +provides a MongoDB-based session backend for Django, which allows you to use +sessions in you Django application with just MongoDB. To enable the MongoEngine +session backend, ensure that your settings module has +``'django.contrib.sessions.middleware.SessionMiddleware'`` in the +``MIDDLEWARE_CLASSES`` field and ``'django.contrib.sessions'`` in your +``INSTALLED_APPS``. From there, all you need to do is add the following line +into you settings module:: + + SESSION_ENGINE = 'mongoengine.django.sessions' diff --git a/mongoengine/django/sessions.py b/mongoengine/django/sessions.py new file mode 100644 index 00000000..7405c856 --- /dev/null +++ b/mongoengine/django/sessions.py @@ -0,0 +1,63 @@ +from django.contrib.sessions.backends.base import SessionBase, CreateError +from django.core.exceptions import SuspiciousOperation +from django.utils.encoding import force_unicode + +from mongoengine.document import Document +from mongoengine import fields +from mongoengine.queryset import OperationError + +from datetime import datetime + + +class MongoSession(Document): + session_key = fields.StringField(primary_key=True, max_length=40) + session_data = fields.StringField() + expire_date = fields.DateTimeField() + + meta = {'collection': 'django_session', 'allow_inheritance': False} + + +class SessionStore(SessionBase): + """A MongoEngine-based session store for Django. + """ + + def load(self): + try: + s = MongoSession.objects(session_key=self.session_key, + expire_date__gt=datetime.now())[0] + return self.decode(force_unicode(s.session_data)) + except (IndexError, SuspiciousOperation): + self.create() + return {} + + def exists(self, session_key): + return bool(MongoSession.objects(session_key=session_key).first()) + + def create(self): + while True: + self.session_key = self._get_new_session_key() + try: + self.save(must_create=True) + except CreateError: + continue + self.modified = True + self._session_cache = {} + return + + def save(self, must_create=False): + s = MongoSession(session_key=self.session_key) + s.session_data = self.encode(self._get_session(no_load=must_create)) + s.expire_date = self.get_expiry_date() + try: + s.save(force_insert=must_create, safe=True) + except OperationError: + if must_create: + raise CreateError + raise + + def delete(self, session_key=None): + if session_key is None: + if self.session_key is None: + return + session_key = self.session_key + MongoSession.objects(session_key=session_key).delete()