2016-06-24 2 views
2

Von Django's documentation for set_expiry:eine Django-Session Verfallen Unabhängig von Modified Zeit

eine Sitzung zu lesen, ist die Aktivität nicht für den Verfall Zwecke berücksichtigt. Der Sitzungsablauf wird ab dem letzten Zeitpunkt der Sitzung geändert berechnet.

Djangos Standardwert für die SESSION_COOKIE_AGE Einstellung ist 1209600 (2 Wochen, in Sekunden). Wenn also eine Sitzung am 1. Januar um Mitternacht erstellt wird, wird sie am 15. Januar um Mitternacht ablaufen. Aber wenn diese Sitzung zum Beispiel am 14. Januar um Mitternacht geändert wird, würde sie am 28. Januar um Mitternacht anstatt am 15. Januar um Mitternacht ablaufen.

Ich bin zufrieden mit der Standardlebensdauer von zwei Wochen, aber ich möchte den effizientesten Weg wissen, damit alle Sitzungen in zwei Wochen ablaufen, nachdem sie erstellt wurden - selbst wenn sie geändert werden. Es scheint so, als müsste ich eine Middleware schreiben, um die Session-Erstellungszeit zu überprüfen und dann das Ablaufdatum auf zwei Wochen zu setzen, aber es scheint, als müsste es einen effizienteren Weg geben.

Antwort

2

Sie sollten die django.contrib.session.backends.db.SessionBase Klasse erweitern und das Verhalten ändern, also nur einen kurzen Blick auf diese Klasse werfen, könnten Sie in die und vielleicht die get_expiry_date(...) Methoden suchen.

Hier ist ein Beispiel für eine benutzerdefinierte Session-Speicherklasse, die nicht die EXPIRY_DATE der Sitzung nicht aktualisiert, wenn eine Sitzung mit diesem Schlüssel bereits

from django.contrib.sessions.backend.db import SessionStorage 

class MySessionStore(SessionStore): 
    def save(self, must_create=False): 
     """ 
     Saves the current session data to the database. If 'must_create' is 
     True, a database error will be raised if the saving operation doesn't 
     create a *new* entry (as opposed to possibly updating an existing 
     entry). 
     """ 
     if self.session_key is None: 
      return self.create() 
     existing_session = Session.objects.filter(session_key=self.session_key) 
     expire_date = self.get_expiry_date() 
     if existing_session.exists(): 
      # Here we select the original expire_date from the database 
      # so when the session is modified and saved, expire_date 
      # remains unchanged 
      if existing_session.first().expire_date is not None: 
       expire_date = existing_session.first().expire_date 
     obj = Session(
      session_key=self._get_or_create_session_key(), 
      session_data=self.encode(self._get_session(no_load=must_create)), 
      expire_date=expire_date 
     ) 
     using = router.db_for_write(Session, instance=obj) 
     try: 
      with transaction.atomic(using=using): 
       obj.save(force_insert=must_create, using=using) 
     except IntegrityError: 
      if must_create: 
       raise CreateError 
      raise 

Jetzt besteht, dass wir eine eigene Session-Klasse haben welche nicht aktualisieren Sie das Verfallsdatum jedes Mal eine Sitzung geändert wird, haben wir unsere eigene Session-Klasse mit dem SESSION_ENGINE Einstellung als SESSION_ENGINE='path.to.MySessionStore'

ich diese Lösung nicht getestet haben, verwenden, ich bin nur ein punt auf eine Antwort nehmen :)

+1

Ah, ich möchte Ich habe über Unterklassen nachgedacht! Danke für den Vorschlag! Ich bin mir ziemlich sicher, dass ich nur die create-Methode überschreiben muss und das war's. Und es müssen nur zwei Zeilen sein! Erste Zeile: 'super (SessionStore, self) .create()' Zweite Zeile: 'self.set_expiry (timezone.now() + timedelta (seconds = settings.SESSION_COOKIE_AGE))' Ich habe das noch nicht gründlich getestet, aber Nach den Tests, die ich gemacht habe, scheint es zu funktionieren. – Nick

Verwandte Themen