2011-02-12 75 views
13

我正在使用Django sessions,我希望能夠在管理界面中看到會話數據。這可能嗎?Django,如何查看管理界面中的會話數據

I.e.對於每個會話,我希望看到存儲在會話數據庫中的數據(就我能收集到的而言,本質上它是一本字典)。

目前我只能看到Session data領域的哈希,如:

gAJ9cQEoVQ5zb3J0aW5nX2Nob2ljZXECVQJQT3EDVQxnYW1lc19wbGF5ZWRxBH1xBVgLAAAAcG9z 
dG1hbi1wYXRxBksDc1UKaXBfYWRkcmVzc3EHVQkxMjcuMC4wLjFxCFUKdGVzdGNvb2tpZXEJVQZ3 
b3JrZWRxClUKZ2FtZV92b3Rlc3ELfXEMdS4wOGJlMDY3YWI0ZmU0ODBmOGZlOTczZTUwYmYwYjE5 
OA== 


我已經把下列admin.py來實現這一目標:

from django.contrib.sessions.models import Session 
... 
admin.site.register(Session) 


I特別是我希望能夠看到每個會話至少有一個IP地址。 (會很好過,如果我能基於對每個總會話的數量計算每個IP地址有多少會議,並責令IP地址。)

謝謝您的幫助:-)

回答

24

你可以做這樣的事情:

from django.contrib.sessions.models import Session 
class SessionAdmin(ModelAdmin): 
    def _session_data(self, obj): 
     return obj.get_decoded() 
    list_display = ['session_key', '_session_data', 'expire_date'] 
admin.site.register(Session, SessionAdmin) 

它可能甚至get_decoded可以在list_display直接使用。如果有一些錯誤可以阻止它正常工作,您可以根據鏈接的Django源碼自行解碼會話數據。

+0

真棒,這不正是我想要的。謝謝。 – 2011-02-12 13:35:27

4

會話數據包含在一個base64編碼醃字典中。這就是你在管理中看到的,因爲這些數據存儲在Session模型的TextField中。

我不認爲任何分佈式django代碼存儲在會話中的IP地址,但你可以自己做,如果你可以訪問它。

爲了顯示真實的會話信息,您可以編寫自己的表單字段來顯示已解碼的信息。請記住,如果要修改它,還必須覆蓋保存方法。你可以看看django/contrib/sessions/models.py中的編碼和解碼方法。

+0

感謝如何會話數據工作的明確闡述了爲什麼它顯示散列數據:) – 2011-02-12 13:44:42

11

從托馬斯的回答繼續,我去了。

import pprint 
from django.contrib.sessions.models import Session 
class SessionAdmin(admin.ModelAdmin): 
    def _session_data(self, obj): 
     return pprint.pformat(obj.get_decoded()).replace('\n', '<br>\n') 
    _session_data.allow_tags=True 
    list_display = ['session_key', '_session_data', 'expire_date'] 
    readonly_fields = ['_session_data'] 
    exclude = ['session_data'] 
    date_hierarchy='expire_date' 
admin.site.register(Session, SessionAdmin) 
3

EB的,否則巨大的回答給我留下錯誤「數據庫返回的QuerySet.dates()無效值的時區定義和pytz安裝? 」。 (我確實安裝了db tz info和pytz,並且我的應用程序廣泛使用了時區。)刪除'date_hierarchy'行爲我解決了問題。所以:

import pprint 
from django.contrib.sessions.models import Session 
class SessionAdmin(admin.ModelAdmin): 
    def _session_data(self, obj): 
     return pprint.pformat(obj.get_decoded()).replace('\n', '<br>\n') 
    _session_data.allow_tags=True 
    list_display = ['session_key', '_session_data', 'expire_date'] 
    readonly_fields = ['_session_data'] 
    exclude = ['session_data'] 
admin.site.register(Session, SessionAdmin)