2012-10-30 68 views
2

使用Django會話時,有些情況下存儲在數據庫中的編碼會話數據不能使用django.contrib.sessions.models.Sessionget_decoded方法解碼,即它將始終返回空字典。如何克服Session.get_decoded哈希檢查?

有沒有解碼數據的方法?

它依賴於django.contrib.sessions.backends.base.SessionBasedecode方法,如果計算的散列值與預期的散列值不同(它會引發SuspiciousOperation異常),將返回空字典。

回答

3

django.contrib.sessions.models.Sessionget_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源代碼。