Django, как просмотреть данные сеанса в интерфейсе администратора

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

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

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

gAJ9cQEoVQ5zb3J0aW5nX2Nob2ljZXECVQJQT3EDVQxnYW1lc19wbGF5ZWRxBH1xBVgLAAAAcG9z
dG1hbi1wYXRxBksDc1UKaXBfYWRkcmVzc3EHVQkxMjcuMC4wLjFxCFUKdGVzdGNvb2tpZXEJVQZ3
b3JrZWRxClUKZ2FtZV92b3Rlc3ELfXEMdS4wOGJlMDY3YWI0ZmU0ODBmOGZlOTczZTUwYmYwYjE5
OA==


Я поставил следующее в admin.py для этого:

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


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

Благодарим за помощь: -)

Ответы

Ответ 1

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

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.

Ответ 2

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

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)

Ответ 3

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

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

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

Ответ 4

В противном случае отличный ответ оставил меня с ошибкой "База данных вернула недопустимое значение в 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)