【问题标题】:Django, how to see session data in the admin interfaceDjango,如何在管理界面中查看会话数据
【发布时间】:2011-06-25 22:48:04
【问题描述】:

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

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

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

gAJ9cQEoVQ5zb3J0aW5nX2Nob2ljZXECVQJQT3EDVQxnYW1lc19wbGF5ZWRxBH1xBVgLAAAAcG9z
dG1hbi1wYXRxBksDc1UKaXBfYWRkcmVzc3EHVQkxMjcuMC4wLjFxCFUKdGVzdGNvb2tpZXEJVQZ3
b3JrZWRxClUKZ2FtZV92b3Rlc3ELfXEMdS4wOGJlMDY3YWI0ZmU0ODBmOGZlOTczZTUwYmYwYjE5
OA==


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

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


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

感谢您的帮助:-)

【问题讨论】:

    标签: python django django-sessions


    【解决方案1】:

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

    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']
    

    【讨论】:

      【解决方案2】:

      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)
      

      【讨论】:

        【解决方案3】:

        你可以这样做:

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

        【讨论】:

        • 太棒了,这正是我想要的。谢谢。
        • 另外,如果您将“readonly_fields = ['_session_data']” (docs.djangoproject.com/en/1.2/ref/contrib/admin/…) 添加到 SessionAdmin 类中,您还可以在查看单个会话时看到字典。
        • @Jonathan:很高兴了解 readonly_fields,感谢分享
        • 对于较新的版本:只需使用 class SessionAdmin(model.ModelAdmin): 注意添加的 model 字。
        【解决方案4】:

        继续 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)
        

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

          • 感谢您清楚地解释了会话数据的工作原理以及为什么显示哈希数据:)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-31
          • 1970-01-01
          • 1970-01-01
          • 2011-08-09
          • 2010-11-08
          • 2011-10-31
          • 2021-06-16
          相关资源
          最近更新 更多