Джанго, как посмотреть данные сессии в интерфейсе администратора - PullRequest
15 голосов
/ 12 февраля 2011

Я использую сеансы Django , и мне нужен способ просмотра данных сеанса в интерфейсе администратора. Это возможно?

т.е. для каждого сеанса я хочу видеть данные, хранящиеся в базе данных сеансов (насколько я могу собрать, по сути, это словарь).

В настоящее время я могу просто увидеть хеш в поле Session data, например:

gAJ9cQEoVQ5zb3J0aW5nX2Nob2ljZXECVQJQT3EDVQxnYW1lc19wbGF5ZWRxBH1xBVgLAAAAcG9z
dG1hbi1wYXRxBksDc1UKaXBfYWRkcmVzc3EHVQkxMjcuMC4wLjFxCFUKdGVzdGNvb2tpZXEJVQZ3
b3JrZWRxClUKZ2FtZV92b3Rlc3ELfXEMdS4wOGJlMDY3YWI0ZmU0ODBmOGZlOTczZTUwYmYwYjE5
OA==


Я добавил следующее в admin.py для достижения этой цели:

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


В частности, я надеялся увидеть хотя бы IP-адрес для каждого сеанса. (Было бы неплохо, если бы я мог посчитать, сколько сеансов на IP-адрес и упорядочить IP-адреса, основываясь на общем количестве сеансов для каждого.)

Спасибо за помощь: -)

Ответы [ 4 ]

28 голосов
/ 12 февраля 2011

Вы можете сделать что-то вроде этого:

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.

11 голосов
/ 14 февраля 2012

Продолжая ответ Томаша, я сказал:

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 голосов
/ 12 февраля 2011

Данные сеанса содержатся в зашифрованном словаре в кодировке base64.Это то, что вы видите в админке, потому что эти данные хранятся в TextField в модели Session.

Я не думаю, что какой-либо распределенный код django хранит IP-адрес в сеансе, но вы можете сделать этосамостоятельно, если вы можете получить к нему доступ.

Чтобы отобразить реальную информацию о сеансе, вы можете написать собственное поле формы, которое представляет декодированную информацию.Имейте в виду, что вам придется также перезаписать метод сохранения, если вы хотите изменить его.Вы можете взглянуть на методы кодирования и декодирования в django/contrib/sessions/models.py.

3 голосов
/ 24 апреля 2014

В противном случае отличный ответ 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)
...