2

django.contrib.sessions.models.SessionDjangoセッションでは、データベースに保存されているエンコードされたセッションデータをのメソッドを使用してデコードできない場合がありますget_decoded。つまり、常に空の辞書が返されます。

そのデータをデコードする方法はありますか?

django.contrib.sessions.backends.base.SessionBaseのメソッドに依存しますdecode。このメソッドは、計算されたハッシュが期待されるハッシュと異なる場合に空の辞書を返します(SuspiciousOperation例外が発生します)。

4

1 に答える 1

3

django.contrib.sessions.models.Sessionget_decodedメソッドはに依存してdjango.contrib.sessions.backends.base.SessionBase.decodeいます。これは、計算されたハッシュが予想されるハッシュと異なる場合(SuspiciousOperation例外が発生する場合) 、空の辞書を返しValueErrorます。または、選択解除の例外があります。実際にはすべての例外をキャッチしますが、それがコードが失敗する理由です。

したがって、ハッシュチェック部分を除いて、これらすべてのコード呼び出しをまとめると、必要なものを取得できます。以下に、特定のセッションオブジェクトのデコードされたセッションデータが存在する場合にそれを提供する関数があります。

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 に答える