Skip to content

Instantly share code, notes, and snippets.

@ericflo
Created November 15, 2010 05:18
Show Gist options
  • Save ericflo/700073 to your computer and use it in GitHub Desktop.
Save ericflo/700073 to your computer and use it in GitHub Desktop.
Message backend which spits out dictionaries able to be json encoded/decoded, for those session backends which do not pickle.
from django.contrib.messages.storage.base import Message, BaseStorage
class JSONSessionStorage(BaseStorage):
"""
Stores messages in JSON-compatible format
"""
session_key = '_messages'
def _to_dict(self, message):
return {
'level': message.level,
'message': message.message,
'extra_tags': message.extra_tags,
}
def _from_dict(self, message):
return Message(**message)
def __init__(self, request, *args, **kwargs):
assert hasattr(request, 'session'), "The session-based temporary "\
"message storage requires session middleware to be installed, "\
"and come before the message middleware in the "\
"MIDDLEWARE_CLASSES list."
super(JSONSessionStorage, self).__init__(request, *args, **kwargs)
def _get(self, *args, **kwargs):
"""
Retrieves a list of messages from the request's session. This storage
always stores everything it is given, so return True for the
all_retrieved flag.
"""
messages = self.request.session.get(self.session_key)
messages = map(self._from_dict, messages or [])
return messages, True
def _store(self, messages, response, *args, **kwargs):
"""
Stores a list of messages to the request's session.
"""
if messages:
messages = map(self._to_dict, messages)
self.request.session[self.session_key] = messages
else:
self.request.session.pop(self.session_key, None)
return []
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment