¿Cómo caducar la sesión debido a la inactividad en Django?

| | | | | | | | | | | | | | | | | |

Nuestra aplicación Django tiene los siguientes requisitos de administración de sesiones.

  1. Las sesiones caducan cuando el usuario cierra el navegador.
  2. Las sesiones caducan después de un período de inactividad.
  3. Detecta cuando una sesión caduca debido a la inactividad y muestra el mensaje apropiado al usuario.
  4. Advierte a los usuarios del vencimiento de una sesión inminente unos minutos antes del final del período de inactividad. Junto con la advertencia, brinde a los usuarios una opción para extender su sesión.
  5. Si el usuario está trabajando en una actividad comercial prolongada dentro de la aplicación que no implica el envío de solicitudes al servidor, la sesión no debe exceder el tiempo de espera. .

Después de leer la documentación, el código de Django y algunas publicaciones de blog relacionadas con esto, se me ocurrió el siguiente enfoque de implementación.

Requisito 1< /strong>
Este requisito se implementa fácilmente configurando SESSION_EXPIRE_AT_BROWSER_CLOSE en True.

Requisito 2
He visto algunas recomendaciones para usar SESSION_COOKIE_AGE para establecer la caducidad de la sesión. período. Pero este método tiene los siguientes problemas.

  • La sesión siempre caduca al final de SESSION_COOKIE_AGE incluso si el usuario está usando activamente la aplicación. (Esto se puede evitar configurando el vencimiento de la sesión a SESSION_COOKIE_AGE en cada solicitud usando un middleware personalizado o guardando la sesión en cada solicitud configurando SESSION_SAVE_EVERY_REQUEST a verdadero. Pero el siguiente problema es inevitable debido al uso de SESSION_COOKIE_AGE).

  • Debido a la forma en que funcionan las cookies, SESSION_EXPIRE_AT_BROWSER_CLOSE y SESSION_COOKIE_AGE se excluyen mutuamente, es decir, la cookie caduca al cerrar el navegador o en el tiempo de vencimiento especificado. Si se usa SESSION_COOKIE_AGE y el usuario cierra el navegador antes de que caduque la cookie, la cookie se conserva y al volver a abrir el navegador se permitirá al usuario (o a cualquier otra persona) ingresar al sistema sin volver a autenticarse.

  • Django depende únicamente de la presencia de la cookie para determinar si la sesión está activa. No verifica la fecha de caducidad de la sesión almacenada con la sesión.

El siguiente método podría usarse para implementar este requisito y solucionar los problemas mencionados anteriormente.

  • No establezca SESSION_COOKIE_AGE.
  • Establezca la fecha de caducidad de la sesión para que sea "hora actual + período de inactividad" en cada solicitud.
  • Sobrescriba process_request en SessionMiddleware y comprobar si ha caducado la sesión. Descartar la sesión si ha caducado.

Requisito 3
Cuando detectamos que la sesión ha caducado (en el SessionMiddleware personalizado anterior), establezca un atributo en la solicitud para indicar el vencimiento de la sesión. Este atributo se puede usar para mostrar un mensaje apropiado al usuario.

Requisito 4
Use JavaScript para detecta la inactividad del usuario, proporciona la advertencia y también una opción para extender la sesión. Si el usuario desea extender, envíe un pulso de mantenimiento al servidor para extender la sesión.

Requisitos t 5
Use JavaScript para detectar la actividad del usuario (durante la operación comercial prolongada) y envíe pulsos de mantenimiento al servidor para evitar que la sesión caduque.


El enfoque de implementación anterior parece muy elaborado y me preguntaba si podría haber un método más simple (especialmente para el Requisito 2).

Cualquier información será muy apreciada.