2009-09-02 13 views
12

De la documentación de Django, que se convirtió en la impresión de que llamar:Caducidad de la sesión Django?

request.session.set_expiry(300) 

de una vista haría que la sesión caduque después de cinco minutos de inactividad ; sin embargo, este no es el comportamiento que estoy experimentando en el tronco django. Si llamo a este método desde una vista y busco otras vistas que no llamen al método, la sesión caducará en cinco minutos. El comportamiento que esperaba era un vencimiento solo después de cinco minutos de inactividad y no simplemente no volver a llamar a set_expiry antes de la expiración.

Mi pregunta es: ¿realmente necesito llamar a set_expiry en cada vista? Si es así, ¿existe algún decorador que pueda ser de ayuda? No me puedo imaginar que esto no sea parte de contrib.

Gracias, Pete

Respuesta

26

Como el autor de esos métodos, que se puede ver que la documentación no es muy clara con respecto a esto. Sus observaciones son correctas: solo las solicitudes que provocan la alteración de la sesión se consideran "actividad".

Puede usar la configuración SESSION_SAVE_EVERY_REQUEST para obtener el comportamiento que busca (al costo obvio de la sesión que tiene que guardarse cada solicitud).

+0

Gracias Chris, eso fue todo. La información que acaba de proporcionar debe incluirse en los documentos. – slypete

+1

de acuerdo. ¿Te importa abrir un boleto? ;) – SmileyChris

3

Un middleware simple probablemente sería mejor que configurar esto en cada vista. Esto es lo que usé

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 

Esto depende de SESSION_EXPIRY se encuentra en su configuración. Su formato es el mismo que request.session.set_expiry.

MIDDLEWARE_CLASSES deberían definirse con este fin en mente:

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

Sería bueno si django.contrib.sessions tomó esta configuración en cuenta por defecto.

+0

¿Echas de menos la respuesta de SmileyChris? 'SESSION_SAVE_EVERY_REQUEST' hace exactamente esto sin ningún middleware personalizado. – slypete

+1

Sí, pero solo al haber llamado set_expiry en una vista, se requiere que todos los usuarios accedan a esa vista específica que establece la caducidad. Es poco probable que sus usuarios se canalicen a través de esta vista específica. Con el middleware puede abstraer este conjunto de caducidad fuera de una vista. Si su respuesta funciona para ti, genial. Solo pensé que esta podría ser una manera más limpia de hacerlo y es la forma en que elegí hacerlo. –

+0

Creo que malinterpretaste la respuesta. 'SESSION_SAVE_EVERY_REQUEST' hace exactamente lo que estás haciendo sin ningún código específico de vista. Solo estoy señalando que reinventó la rueda. – slypete

Cuestiones relacionadas