Come far scadere la sessione per inattività in Django?

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

La nostra applicazione Django ha i seguenti requisiti di gestione delle sessioni.

  1. Le sessioni scadono quando l'utente chiude il browser.
  2. Le sessioni scadono dopo un periodo di inattività.
  3. Rileva quando una sessione scade a causa di inattività e mostra un messaggio appropriato all'utente.
  4. Avvisa gli utenti della scadenza di una sessione imminente pochi minuti prima della fine del periodo di inattività. Insieme all'avviso, fornisci agli utenti un'opzione per estendere la sessione.
  5. Se l'utente sta lavorando a una lunga attività commerciale all'interno dell'app che non prevede l'invio di richieste al server, la sessione non deve scadere .

Dopo aver letto la documentazione, il codice Django e alcuni post del blog relativi a questo, ho escogitato il seguente approccio di implementazione.

Requisito 1< /strong>
Questo requisito è facilmente implementabile impostando SESSION_EXPIRE_AT_BROWSER_CLOSE su True.

Requisito 2
Ho visto alcuni consigli per utilizzare SESSION_COOKIE_AGE per impostare la scadenza della sessione periodo. Ma questo metodo presenta i seguenti problemi.

  • La sessione scade sempre alla fine di SESSION_COOKIE_AGE anche se l'utente sta utilizzando attivamente l'applicazione. (Ciò può essere evitato impostando la scadenza della sessione a SESSION_COOKIE_AGE su ogni richiesta utilizzando un middleware personalizzato o salvando la sessione su ogni richiesta impostando SESSION_SAVE_EVERY_REQUEST su true. Ma il problema successivo è inevitabile a causa dell'uso di SESSION_COOKIE_AGE.)

  • A causa del modo in cui funzionano i cookie, SESSION_EXPIRE_AT_BROWSER_CLOSE e SESSION_COOKIE_AGE si escludono a vicenda, ovvero il cookie scade alla chiusura del browser o alla scadenza indicata. Se viene utilizzato SESSION_COOKIE_AGE e l'utente chiude il browser prima della scadenza del cookie, il cookie viene conservato e la riapertura del browser consentirà all'utente (o a chiunque altro) di accedere al sistema senza essere nuovamente autenticato.

  • Django si basa solo sulla presenza del cookie per determinare se la sessione è attiva. Non controlla la data di scadenza della sessione memorizzata con la sessione.

Il metodo seguente potrebbe essere utilizzato per implementare questo requisito e risolvere i problemi sopra menzionati.

  • Non impostare SESSION_COOKIE_AGE.
  • Imposta la data di scadenza della sessione su "ora corrente + periodo di inattività" su ogni richiesta.
  • Sostituisci process_request in SessionMiddleware e verifica la scadenza della sessione. Elimina la sessione se è scaduta.

Requisito 3
Quando rileviamo che la sessione è scaduta (nel SessionMiddleware personalizzato sopra), imposta un attributo sulla richiesta per indicare la scadenza della sessione. Questo attributo può essere utilizzato per visualizzare un messaggio appropriato per l'utente.

Requisito 4
Usa JavaScript per rilevare l'inattività dell'utente, fornire l'avviso e anche un'opzione per estendere la sessione. Se l'utente desidera estendere, inviare un impulso di mantenimento in vita al server per estendere la sessione.

Requisiti t 5
Utilizzare JavaScript per rilevare l'attività dell'utente (durante la lunga operazione aziendale) e inviare impulsi keep alive al server per impedire la scadenza della sessione.


L'approccio di implementazione di cui sopra sembra molto elaborato e mi chiedevo se potesse esistere un metodo più semplice (soprattutto per il Requisito 2).

Qualsiasi approfondimento sarà molto apprezzato.