2

对于 Django 会话,在某些情况下,存储在数据库中的编码会话数据无法使用django.contrib.sessions.models.Session'get_decoded方法进行解码,即它总是会返回一个空字典。

有没有办法解码这些数据?

它依赖于django.contrib.sessions.backends.base.SessionBase'sdecode方法,如果计算的哈希值与预期的哈希值不同(它会引发SuspiciousOperation异常),它将返回一个空字典。

4

1 回答 1

3

django.contrib.sessions.models.Sessionget_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 项目的源代码。

于 2012-10-30T20:05:06.570 回答