Como expirar a sessão devido à inatividade no Django?

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

Nosso aplicativo Django tem os seguintes requisitos de gerenciamento de sessão.

  1. As sessões expiram quando o usuário fecha o navegador.
  2. As sessões expiram após um período de inatividade.
  3. >
  4. Detectar quando uma sessão expira devido à inatividade e exibir a mensagem apropriada para o usuário.
  5. Avisar os usuários sobre a expiração de uma sessão iminente alguns minutos antes do final do período de inatividade. Junto com o aviso, forneça aos usuários a opção de estender a sessão.
  6. Se o usuário estiver trabalhando em uma longa atividade comercial no aplicativo que não envolva o envio de solicitações ao servidor, a sessão não deve expirar .

Depois de ler a documentação, o código do Django e alguns posts de blog relacionados a isso, cheguei à seguinte abordagem de implementação.

Requisito 1< /strong>
Este requisito é facilmente implementado definindo SESSION_EXPIRE_AT_BROWSER_CLOSE como True.

Requisito 2
Vi algumas recomendações para usar SESSION_COOKIE_AGE para definir a expiração da sessão período. Mas este método tem os seguintes problemas.

  • A sessão sempre expira no final da SESSION_COOKIE_AGE mesmo se o usuário estiver usando o aplicativo ativamente. (Isso pode ser evitado definindo a expiração da sessão para SESSION_COOKIE_AGE em cada solicitação usando um middleware personalizado ou salvando a sessão em cada solicitação definindo SESSION_SAVE_EVERY_REQUEST para verdadeiro. Mas o próximo problema é inevitável devido ao uso de SESSION_COOKIE_AGE.)

  • Devido ao modo como os cookies funcionam, SESSION_EXPIRE_AT_BROWSER_CLOSE e SESSION_COOKIE_AGE são mutuamente exclusivos, ou seja, o cookie expira ao fechar o navegador ou no tempo de expiração especificado. Se SESSION_COOKIE_AGE for usado e o usuário fechar o navegador antes que o cookie expire, o cookie será retido e a reabertura do navegador permitirá que o usuário (ou qualquer outra pessoa) entre no sistema sem ser autenticado novamente.

  • Django depende apenas da presença do cookie para determinar se a sessão está ativa. Ele não verifica a data de expiração da sessão armazenada com a sessão.

O método a seguir pode ser usado para implementar esse requisito e solucionar os problemas mencionados acima.

  • Não defina SESSION_COOKIE_AGE.
  • Defina a data de expiração da sessão como "hora atual + período de inatividade" em cada solicitação.
  • Substituir process_request em SessionMiddleware e verifique a expiração da sessão. Descarte a sessão se ela tiver expirado.

Requisito 3
Quando detectamos que a sessão expirou (no SessionMiddleware personalizado acima), defina um atributo na solicitação para indicar a expiração da sessão. Esse atributo pode ser usado para exibir uma mensagem apropriada ao usuário.

Requisito 4
Use JavaScript para detectar a inatividade do usuário, fornecer o aviso e também uma opção para estender a sessão. Se o usuário desejar estender, envie um pulso de manutenção de atividade ao servidor para estender a sessão.

Requisitos t 5
Use JavaScript para detectar a atividade do usuário (durante a longa operação de negócios) e envie pulsos de manutenção de atividade para o servidor para evitar que a sessão expire.


A abordagem de implementação acima parecem muito elaborados e eu queria saber se poderia haver um método mais simples (especialmente para o Requisito 2).

Qualquer informação será muito apreciada.