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

26
我正在使用Django sessions,希望能够在管理界面中查看会话数据。这个有可能吗?
也就是说,对于每个会话,我想要查看存储在会话数据库中的数据(据我了解,这基本上是一个字典)。
目前,我只能在Session data字段中看到哈希值,例如:
gAJ9cQEoVQ5zb3J0aW5nX2Nob2ljZXECVQJQT3EDVQxnYW1lc19wbGF5ZWRxBH1xBVgLAAAAcG9z
dG1hbi1wYXRxBksDc1UKaXBfYWRkcmVzc3EHVQkxMjcuMC4wLjFxCFUKdGVzdGNvb2tpZXEJVQZ3
b3JrZWRxClUKZ2FtZV92b3Rlc3ELfXEMdS4wOGJlMDY3YWI0ZmU0ODBmOGZlOTczZTUwYmYwYjE5
OA==


我已将以下内容放入admin.py中以实现此目的:

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


特别是,我希望能够看到每个会话至少一个IP地址。(如果我能统计每个IP地址的会话数,并根据每个IP地址的总会话数排序,那就太好了。)谢谢你的帮助 :-)
5个回答

46
你可以这样做:

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)

甚至可能可以在list_display中直接使用get_decoded。如果有什么问题防止这样工作良好,您可以根据链接的Django源代码自己解码会话数据。


太棒了,这正是我想要的。谢谢你。 - Jon Cox
2
同时,如果您将"readonly_fields = ['_session_data']" (http://docs.djangoproject.com/en/1.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields)添加到SessionAdmin类中,您还可以在查看单个会话时查看字典。 - Jon Cox
@Jonathan:了解readonly_fields很好,谢谢分享。 - Tomasz Zieliński
对于更新版本:只需使用 class SessionAdmin(model.ModelAdmin):,注意增加了 model 这个单词。 - ajinzrathod

16

继续Tomasz的回答,我选择了:

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)

4

EB的回答很好,但我遇到了一个错误:“在QuerySet.dates()中,数据库返回了无效值。时区定义和pytz是否已安装?”(我已经安装了数据库时区信息和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)

4

会话数据包含在一个base64编码的pickle字典中。这就是你在管理员中看到的,因为这些数据存储在Session模型的TextField中。

我认为没有任何分布式Django代码将IP地址存储在会话中,但如果您可以访问它,您可以自己实现。

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


感谢您清晰地解释了会话数据的工作原理以及为什么显示哈希数据 :) - Jon Cox

2

除了之前的回答,我们还可以显示该会话的用户,这对于识别用户的会话非常有帮助。

class SessionAdmin(admin.ModelAdmin):
    def user(self, obj):
        session_user = obj.get_decoded().get('_auth_user_id')
        user = User.objects.get(pk=session_user)
        return user.email
    def _session_data(self, obj):
        return pprint.pformat(obj.get_decoded()).replace('\n', '<br>\n')
    _session_data.allow_tags = True
    list_display = ['user', 'session_key', '_session_data', 'expire_date']
    readonly_fields = ['_session_data']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接