Session age determination in django

How to determine the age of a session object in django?

+4
source share
3 answers

Well, that’s what I came up with. Much better. I think this is as cheap as using post_save on a Session object that will receive:

from django.db import models from people.models import Member from django.contrib.sessions.models import Session from django.contrib.sessions.backends.db import SessionStore from django.db.models import * from django.db.models.signals import post_save, pre_delete, post_init from datetime import datetime class SessionInfo(models.Model): #note: a OneToOneField with the name 'session' has been added as part of the inheritance created = models.DateTimeField(auto_now_add=True) #joined field is auto initialized with creation time session = models.OneToOneField(Session) def age(self): return (datetime.now() - self.created) def session_create_listener(instance, **kwargs): store = SessionStore(session_key=instance.session_key) if '_auth_user_id' in store: try: instance.sessioninfo except SessionInfo.DoesNotExist: sessioninfo = SessionInfo(session=instance) sessioninfo.save() post_save.connect(session_create_listener, sender=Session) 
+2
source

you will need to connect the post_init signal coming from django.contrib.sessions.models.Session to receive a notification about the beginning (or end) of the session, and then store this information in the model in your own application. eg.

 from django.contrib.sessions.models import Session from django.db.models import * from django.db.models.signals import post_init, pre_delete from django.dispatch import receiver from datetime import datetime class SessionTimer(Session): #note: a OneToOneField with the name 'session' has been added as part of the inheritance created = DateTimeField(auto_now_add=True) #joined field is auto initialized with creation time def age(self): return (datetime.now() - self.created) @receiver(post_init, sender=Session) def session_create_listener(instance, **kwargs): created_session = instance timer_entry = SessionTimer(session=created_session) timer_entry.save() @receiver(pre_delete, sender=Session) def session_destroy_listener(instance, **kwargs): SessionTimer.objects.get(session=instance).delete() # short version 

so when you need to know the age of the session, use session.sessiontimer.age() . this will return a TimeDelta object representing the age of the session.

+1
source

Here's what I did instead of Thomas's suggestion. Please note that I refused to use the receiver decoder so that it still worked up to 1.3.

(This requires a major correction).

 from django.db import models from people.models import Member from django.contrib.sessions.models import Session from django.contrib.sessions.backends.db import SessionStore from django.db.models import * from django.db.models.signals import post_save, pre_delete, post_init #from django.dispatch import receiver from datetime import datetime class SessionInfo(models.Model): #note: a OneToOneField with the name 'session' has been added as part of the inheritance created = models.DateTimeField(auto_now_add=True) #joined field is auto initialized with creation time session = models.OneToOneField(Session) def age(self): return (datetime.now() - self.created) def session_create_listener(instance, **kwargs): store = SessionStore(session_key=instance.session_key) if '_auth_user_id' in store: try: sessioninfo = SessionInfo.objects.get(session=instance) except SessionInfo.DoesNotExist: sessioninfo = SessionInfo(session=instance) sessioninfo.save() store['anonymous'] = False store.save() else: try: store['anonymous'] except KeyError: store['anonymous'] = True store.save() post_save.connect(session_create_listener, sender=Session) 

I hope that someone can fix this for me, because I cannot believe that this is the most effective way to do this.

First of all, this adds TWO additional database deletes (on the first try: sessioninfo = SessionInfo.objects.get (session = instance)) every time the session is changed.

The first is obvious during the search. The second occurs when salvation occurs, again starting the whole process.

What to do instead?

0
source

All Articles