django.contrib.sessions.models.Session
的get_decoded
方法依赖于django.contrib.sessions.backends.base.SessionBase.decode
,如果计算的哈希值与预期的哈希值不同(它引发SuspiciousOperation
异常),则返回一个空字典,存在 aValueError
或 unpickling 异常。它确实会捕获所有异常,但这些是代码可能失败的原因。
因此,将所有这些代码调用包装在一起,除了哈希检查部分,您可以获得所需的内容。下面有一个函数可以为您提供某个会话对象的解码会话数据,前提是它存在。
import base64
import pickle
from django.contrib.sessions.models import Session
from django.utils.encoding import force_unicode
def decode_session_data(session_key):
"""Decode the data in a session object stored under ``session_key``.
:param session_key: e.g. ``'1180b5ed42c2a3a5f217e35b755865da'``
:return: decoded session data
:rtype: :class:`dict`
"""
session_obj = Session.objects.get(pk=session_key)
session_data = force_unicode(session_obj.session_data)
encoded_data = base64.decodestring(session_data)
hash, pickled = encoded_data.split(':', 1)
return pickle.loads(pickled)
来源:https ://gist.github.com/3982485 ,基于Django 项目的源代码。