23

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

即对于每个会话,我想查看存储在会话数据库中的数据(就我所能收集的而言,它本质上是一个字典)。

目前我只能在该Session data字段中看到一个哈希,例如:

gAJ9cQEoVQ5zb3J0aW5nX2Nob2ljZXECVQJQT3EDVQxnYW1lc19wbGF5ZWRxBH1xBVgLAAAAcG9z
dG1hbi1wYXRxBksDc1UKaXBfYWRkcmVzc3EHVQkxMjcuMC4wLjFxCFUKdGVzdGNvb2tpZXEJVQZ3
b3JrZWRxClUKZ2FtZV92b3Rlc3ELfXEMdS4wOGJlMDY3YWI0ZmU0ODBmOGZlOTczZTUwYmYwYjE5
OA==


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

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


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

感谢您的帮助 :-)

4

5 回答 5

37

你可以这样做:

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 源自己解码会话数据。

于 2011-02-12T13:15:02.807 回答
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)
于 2012-02-13T20:17:52.243 回答
4

会话数据包含在 base64 编码的腌制字典中。这就是您在管理员中看到的内容,因为该数据存储在 Session 模型的 TextField 中。

我认为任何分布式 django 代码都不会在会话中存储 IP 地址,但如果您可以访问它,您可以自己进行操作。

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

于 2011-02-12T04:06:00.757 回答
4

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)
于 2014-04-24T18:13:35.040 回答
0

除了以前的答案,我们还可以显示该会话的用户,这有助于识别用户的会话。

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']
于 2021-07-15T06:47:05.873 回答