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)