2009-09-02 14 views
12

Von Djangos Dokumentation, ich unter dem Eindruck war, dass Aufruf:Django Sitzung Ablauf?

request.session.set_expiry(300) 

von einer Ansicht der Sitzung nach fünf Minuten führen würde Inaktivität in Kürze beendet; Dies ist jedoch nicht das Verhalten, das ich in Django Trunk erfahre. Wenn ich diese Methode in einer Ansicht aufruft und zu anderen Ansichten navigiere, die die Methode nicht aufrufen, läuft die Sitzung in fünf Minuten ab. Das Verhalten, das ich erwartet hatte, lief erst nach fünf Minuten Inaktivität ab und versagte nicht einfach vor dem Ablauf erneut set_expiry aufzurufen.

Meine Frage ist dann, muss ich wirklich set_expiry in jeder Ansicht aufrufen? Wenn ja, gibt es einen Dekorateur, der hilfreich sein könnte? Ich kann mir nicht vorstellen, dass das nicht Teil von contrib ist.

Danke, Pete

Antwort

26

Als Autor dieser Methoden, kann ich sehen, dass die Dokumentation in Bezug auf diese ist nicht ganz klar. Ihre Beobachtungen sind korrekt: Nur Anfragen, die eine Änderung der Sitzung bewirken, werden als "Aktivität" betrachtet.

Sie können die Einstellung SESSION_SAVE_EVERY_REQUEST verwenden, um das von Ihnen gewünschte Verhalten zu erhalten (zu den offensichtlichen Kosten, dass die Sitzung bei jeder Anforderung gespeichert werden muss).

+0

Danke Chris, das hat es geschafft. Die Informationen, die Sie gerade angegeben haben, sollten in den Dokumenten enthalten sein. – slypete

+1

Einverstanden. Möchten Sie ein Ticket öffnen? ;) – SmileyChris

3

Eine einfache Middleware würde wahrscheinlich besser als das Einrichten in jeder Ansicht tun. Das habe ich benutzt.

class SessionExpiry(object): 
    """ Set the session expiry according to settings """ 
    def process_request(self, request): 
     if getattr(settings, 'SESSION_EXPIRY', None): 
      request.session.set_expiry(settings.SESSION_EXPIRY) 
     return None 

Dies hängt von SESSION_EXPIRY in der Config gesetzt wird. Es ist das gleiche Format wie request.session.set_expiry.

MIDDLEWARE_CLASSES = (
    ... 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    '<yourproject>.<yourapp>.middleware.SessionExpiry', 
    ... 
} 

Es wäre schön, wenn django.contrib.sessions nimmt diese Einstellung berücksichtigt standardmäßig:

MIDDLEWARE_CLASSES sollte mit dieser Reihenfolge im Sinne definiert werden.

+0

Hast du SmileyChris 'Antwort vermisst? 'SESSION_SAVE_EVERY_REQUEST' macht genau dies ohne irgendeine kundenspezifische Middleware. – slypete

+1

Ja, aber nur mit set_expiry, das in einer Ansicht aufgerufen wird, müssen alle Ihre Benutzer die bestimmte (n) Ansicht (en) treffen, die den Ablauf festlegen. Es ist unwahrscheinlich, dass Ihre Benutzer eine bestimmte Ansicht durchforsten. Mit der Middleware können Sie dieses Ablaufset außerhalb einer Ansicht abstrahieren. Wenn seine Antwort für dich funktioniert, cool. Ich dachte nur, dass dies ein sauberer Weg wäre, und es ist die Art, wie ich es gewählt habe. –

+0

Ich glaube, du hast die Antwort falsch verstanden. 'SESSION_SAVE_EVERY_REQUEST' macht genau das, was Sie tun, ohne irgendeinen viewspezifischen Code. Ich habe nur darauf hingewiesen, dass Sie das Rad neu erfunden haben. – slypete