La nostra applicazione Django ha i seguenti requisiti di gestione delle sessioni.Come scadere della sessione a causa di inattività in Django?
- Le sessioni scadono quando l'utente chiude il browser.
- Le sessioni scadono dopo un periodo di inattività.
- Rileva quando una sessione scade a causa di inattività e visualizza un messaggio appropriato all'utente.
- Avvisa degli utenti di una sessione imminente alcuni minuti prima della fine del periodo di inattività. Insieme all'avviso, fornire agli utenti un'opzione per estendere la sessione.
- Se l'utente sta lavorando su un'attività commerciale lunga 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 di blog relativi a questo, ho trovato il seguente approccio di implementazione.
Requisito 1
Questo requisito è facilmente implementata impostando SESSION_EXPIRE_AT_BROWSER_CLOSE su True.
Requisito 2
ho visto alcune raccomandazioni di usare SESSION_COOKIE_AGE per impostare il periodo di scadenza della sessione. Ma questo metodo ha i seguenti problemi.
La sessione scade sempre alla fine del SESSION_COOKIE_AGE anche se l'utente sta usando attivamente l'applicazione. (Questo può essere evitato impostando la sessione scadenza 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 prossimo problema è inevitabile a causa dell'uso di SESSION_COOKIE_AGE.)
A causa del funzionamento dei 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 specificata. Se SESSION_COOKIE_AGE viene utilizzato e l'utente chiude il browser prima che il cookie scada, il cookie viene mantenuto e la riapertura del browser consentirà all'utente (oa chiunque altro) nel sistema senza essere nuovamente autenticato.
Django si basa solo sul cookie presente per determinare se la sessione è attiva. Non controlla la data di scadenza della sessione memorizzata con la sessione.
Il seguente metodo potrebbe essere utilizzato per implementare questo requisito e per risolvere i problemi sopra menzionati.
- Non impostare SESSION_COOKIE_AGE.
- Impostare la data di scadenza della sessione come "ora corrente + periodo di inattività" su ogni richiesta.
- Sovrascrivere process_request in SessionMiddleware e verificare la scadenza della sessione. Scarta la sessione se è scaduta.
Requisito 3
Quando si rileva che la sessione è scaduta (nel SessionMiddleware personalizzato sopra), impostare un attributo in merito alla richiesta di indicare la sessione di scadenza. Questo attributo può essere utilizzato per visualizzare un messaggio appropriato all'utente.
Requisito 4
Usa JavaScript per rilevare inattività dell'utente, fornire l'avvertimento e anche un'opzione per estendere la sessione. Se l'utente desidera estendere, inviare un impulso keep-alive al server per estendere la sessione.
Requisito 5
Usa JavaScript per rilevare l'attività degli utenti (durante l'operazione di business a lungo) e inviare impulsi mantenere vivo al server per evitare di scadere della sessione.
L'approccio di implementazione di cui sopra sembrano molto elaborato e mi chiedevo se ci potrebbe un metodo più semplice (in particolare per il requisito 2).
Eventuali approfondimenti saranno molto apprezzati.
+1 per fornire una soluzione dettagliata – Don
"A causa del funzionamento dei 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 specificata.Se viene utilizzato SESSION_COOKIE_AGE e l'utente chiude il browser prima che il cookie scada, il cookie viene mantenuto e la riapertura del browser consentirà all'utente (oa chiunque altro) di accedere al sistema senza essere nuovamente autenticato. " Correggimi se sbaglio, ma questo non sembra più essere vero nelle nuove versioni di Django? (Almeno 1.5+) –
C'è un middleware che può fare ciò di cui hai bisogno. [su github] (https://github.com/subhranath/django-session-idle-timeout) e [su pypi] (http://pypi.python.org/pypi/django-session-idle-timeout/1.3 .1) – gbutler