Added a MongoEngine backend for Django sessions
This commit is contained in:
parent
afd416c84e
commit
484bc1e6f0
@ -27,3 +27,16 @@ file::
|
|||||||
The :mod:`~mongoengine.django.auth` module also contains a
|
The :mod:`~mongoengine.django.auth` module also contains a
|
||||||
:func:`~mongoengine.django.auth.get_user` helper function, that takes a user's
|
:func:`~mongoengine.django.auth.get_user` helper function, that takes a user's
|
||||||
:attr:`id` and returns a :class:`~mongoengine.django.auth.User` object.
|
: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'
|
||||||
|
63
mongoengine/django/sessions.py
Normal file
63
mongoengine/django/sessions.py
Normal file
@ -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()
|
Loading…
x
Reference in New Issue
Block a user