Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django, how to see session data in the admin interface

I'm using Django sessions and I would like a way of seeing the session data in the admin interface. Is this possible?

I.e. for each session I want to see the data stored in the session database (which is essentially a dictionary as far as I can gather).

Currently I can just see a hash in the Session data field, such as:

gAJ9cQEoVQ5zb3J0aW5nX2Nob2ljZXECVQJQT3EDVQxnYW1lc19wbGF5ZWRxBH1xBVgLAAAAcG9z
dG1hbi1wYXRxBksDc1UKaXBfYWRkcmVzc3EHVQkxMjcuMC4wLjFxCFUKdGVzdGNvb2tpZXEJVQZ3
b3JrZWRxClUKZ2FtZV92b3Rlc3ELfXEMdS4wOGJlMDY3YWI0ZmU0ODBmOGZlOTczZTUwYmYwYjE5
OA==


I have put the following into admin.py to achieve this:

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


In particular I was hoping to be able to see at least an IP address for each session. (Would be nice too if I could count how many sessions per IP address and order the IPs based on number of sessions in total for each.)

Thank you for your help :-)

like image 224
Jon Cox Avatar asked Feb 12 '11 02:02

Jon Cox


3 Answers

You can do something like this:

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)

It might be even that get_decoded can be used directly in list_display. And in case there's some catch that prevents this from working ok, you can decode the session data yourself, based on the linked Django source.

like image 134
Tomasz Zieliński Avatar answered Oct 17 '22 21:10

Tomasz Zieliński


Continuing from Tomasz's answer, I went with:

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)
like image 33
EB. Avatar answered Oct 17 '22 23:10

EB.


Session data is contained in a base64 encoded pickled dictionary. That's is what you're seeing in the admin because that data is stored in a TextField in the Session model.

I don't think any distributed django code stores the ip address in the session but you could do it yourself if you can access it.

In order to display the real session information, you may write your own form field that presents the decoded information. Keep in mind that you'll have to also overwrite the save method if you want to modify it. You can take a look at the encode and decode methods in django/contrib/sessions/models.py.

like image 4
Eric Fortin Avatar answered Oct 17 '22 21:10

Eric Fortin