django.contrib.sessions.models.Session
的get_decoded
方法依賴於django.contrib.sessions.backends.base.SessionBase.decode
,這將返回一個空的字典如果計算的散列是從預期散列(它提出了一個SuspiciousOperation
例外)不同,是有ValueError
或在unpickle異常。它會真正捕獲所有異常,但這些都是代碼可能失敗的原因。
因此,除散列檢查部分外,將所有這些代碼調用包裝在一起,就可以得到你所需要的東西。下面有一個函數會給你一個特定會話對象的解碼會話數據,只要它存在。
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 project源代碼。