diff --git a/docs/django.rst b/docs/django.rst index 62d4dd41..5d2423f2 100644 --- a/docs/django.rst +++ b/docs/django.rst @@ -90,10 +90,15 @@ session backend, ensure that your settings module has into your settings module:: SESSION_ENGINE = 'mongoengine.django.sessions' + SESSION_SERIALIZER = 'mongoengine.django.sessions.BSONSerializer' Django provides session cookie, which expires after ```SESSION_COOKIE_AGE``` seconds, but doesn't delete cookie at sessions backend, so ``'mongoengine.django.sessions'`` supports `mongodb TTL `_. +.. note:: ``SESSION_SERIALIZER`` is only necessary in Django 1.6 as the default + serializer is based around JSON and doesn't know how to convert + ``bson.objectid.ObjectId`` instances to strings. + .. versionadded:: 0.2.1 Storage diff --git a/mongoengine/django/sessions.py b/mongoengine/django/sessions.py index 3528dcca..f260951b 100644 --- a/mongoengine/django/sessions.py +++ b/mongoengine/django/sessions.py @@ -1,3 +1,4 @@ +from bson import json_util from django.conf import settings from django.contrib.sessions.backends.base import SessionBase, CreateError from django.core.exceptions import SuspiciousOperation @@ -109,3 +110,15 @@ class SessionStore(SessionBase): return session_key = self.session_key MongoSession.objects(session_key=session_key).delete() + + +class BSONSerializer(object): + """ + Serializer that can handle BSON types (eg ObjectId). + """ + def dumps(self, obj): + return json_util.dumps(obj, separators=(',', ':')).encode('ascii') + + def loads(self, data): + return json_util.loads(data.decode('ascii')) +