Django,如何在管理中查看会话数据

2024-04-19 05:52:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Django sessions,我想用一种方式在管理界面中查看会话数据。这可能吗?

也就是说,对于每一个会话,我都希望看到会话数据库中存储的数据(就我所能收集到的而言,它实际上是一个字典)。

目前我只能在Session data字段中看到一个散列,例如:

gAJ9cQEoVQ5zb3J0aW5nX2Nob2ljZXECVQJQT3EDVQxnYW1lc19wbGF5ZWRxBH1xBVgLAAAAcG9z
dG1hbi1wYXRxBksDc1UKaXBfYWRkcmVzc3EHVQkxMjcuMC4wLjFxCFUKdGVzdGNvb2tpZXEJVQZ3
b3JrZWRxClUKZ2FtZV92b3Rlc3ELfXEMdS4wOGJlMDY3YWI0ZmU0ODBmOGZlOTczZTUwYmYwYjE5
OA==


为了实现这一点,我在admin.py中添加了以下内容:

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


特别是我希望能够看到每个会话至少一个IP地址。(如果我能计算每个IP地址有多少会话,并根据每个会话的总数对IP进行排序,那也太好了。)

谢谢你的帮助:-)


Tags: 数据djangopy数据库data界面字典admin
3条回答

继续托马斯的回答,我接着说:

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)

你可以这样做:

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。如果有一些陷阱阻止它正常工作,您可以自己解码会话数据,基于链接的Django源。

会话数据包含在base64编码的pickled字典中。这就是您在管理中看到的,因为该数据存储在会话模型的文本字段中。

我不认为任何分布式django代码都会在会话中存储ip地址,但是如果您可以访问它,您可以自己完成。

为了显示真实的会话信息,您可以编写自己的表单字段来显示解码的信息。请记住,如果要修改save方法,还必须覆盖它。您可以查看django/contrib/sessions/models.py中的编码和解码方法。

相关问题 更多 >