2012-12-07 4 views
8

Quindi la mia comprensione delle sessioni Flask è che posso usarlo come un dizionario e aggiungere i valori a una sessione facendo:Perché alcuni valori della sessione Flask scompaiono dalla sessione dopo aver chiuso la finestra del browser, ma poi riappaiono in seguito senza che io li aggiungessi?

sessione [ 'name-chiave'] = 'certo valore qui'

e che funziona bene.

Su un percorso ho la chiamata client che utilizza il post AJAX, assegno un valore alla sessione. E funziona bene. Posso cliccare su varie pagine del mio sito e il valore rimane nella sessione. Se chiudo comunque la finestra del browser, e poi torno al mio sito, il valore della sessione che avevo lì è sparito.

Quindi è strano e si penserebbe che il problema è che la sessione non è permanente. Ho anche implementato Flask-Openid e che utilizza la sessione per archiviare le informazioni e che fa persistere se chiudo la finestra del browser e la riapre. Ho anche controllato il cookie dopo aver chiuso la finestra del browser, ma prima di tornare al mio sito, e il cookie è effettivamente ancora lì.

Un altro comportamento strano (che può essere correlato) è che alcuni valori che ho scritto sulla sessione a scopo di test spariranno quando accedo al percorso di posta AJAX e assegnerò il valore corretto. Quindi è strano, ma ciò che è veramente strano è che quando chiudo la finestra del browser e la riapre, perdendo così il valore che stavo cercando di mantenere, quelli che ho perso in precedenza tornano effettivamente! Non vengono riassegnati perché non c'è alcun codice nei miei file Python per riassegnare quei valori.

Ecco alcune uscite da aiutare a rendere più chiaro. Sono tutti prodotti da una rotta per una pagina reale e non dalla rotta AJAX che ho menzionato sopra.

Questo è l'output dopo che ho assegnato il valore che voglio memorizzare nella sessione. La chiave valore è 'userid' - tutti gli altri valori sono fittizi che ho aggiunto nel tentativo di risolvere questo problema. 'userid': 8 rimarrà nella sessione finché non chiudo la finestra del browser. Posso accedere ad altri percorsi e il valore rimarrà lì come dovrebbe.

['session.=', <SecureCookieSession {'userid': 8, 'test_variable_num': 102, 'adding using before request': 'hi', '_permanent': True, 'test_variable_text': 'hi!'}>] 

Se faccio chiudere la finestra del browser, e tornare nel sito, ma senza rifare la richiesta POST AJAX, ottengo questo output:

['session.=', <SecureCookieSession {'adding using before request': 'hi', '_permanent': True, 'yo': 'yo'}>] 

Il 'yo' valore non era in la prima prima uscita. Non so da dove viene. Ho cercato il mio codice per 'yo' e non ci sono casi in cui io possa assegnare quel valore ovunque. Penso di averlo aggiunto alla sessione giorni fa. Quindi sembra che sia persistente, ma nascosto quando vengono scritti gli altri valori.

E quest'ultimo è che accedo nuovamente al percorso postale AJAX e quindi alla pagina che stampa le chiavi utilizzando il debug. Stesso risultato della prima uscita ho incollato sopra, che ci si aspetterebbe, e il valore di 'yo' è andato di nuovo (ma tornerà se chiudo la finestra del browser)

['session.=', <SecureCookieSession {'userid': 8, 'test_variable_num': 102, 'adding using before request': 'hi', '_permanent': True, 'test_variable_text': 'hi!'}>] 

Ho provato questo sia in Chrome e Firefox.

Quindi trovo tutto ciò strano e immagino che derivi da un fraintendimento di come funzionano le sessioni. Penso che siano dizionari e posso scrivere i valori del dizionario in essi e recuperarli dopo qualche giorno fintanto che imposto la sessione su permanente e il cookie non viene cancellato.

Qualche idea del perché questo strano comportamento sta accadendo?

risposta

12

Risulta che il problema riguardava un cookie con più domini. Sto facendo funzionare localmente il luogo a 127.0.0.1:5000 ma a volte il luogo è stato accesso a localhost: 5000 - quindi ciascuno di quei domini ha avuto un biscotto separato. Il che spiega perché i dati stavano scomparendo e quindi riapparendo. Era solo associato a domini diversi.

Qui di seguito è solo dettaglio in più

Ciò è avvenuto perché Facebook non piace indirizzi IP per i nomi di dominio. Quindi, quando sviluppavo localmente, stavo usando 127.0.0.1:5000 ma l'url di callback di Facebook era localhost: 5000. Che funziona bene perché Flask raccoglie le richieste su entrambi gli URL e li tratta allo stesso modo - tutte le rotte funzionano come previsto. Ad eccezione dei cookie di sessione che vengono associati ai diversi URL.

5

Le sessioni di pallone verranno eliminate una volta chiuso il browser SE non è stato impostato session.permanent = True. Questo è il modo in cui le sessioni dei flask sono definite ed è menzionata nei documenti.

Se si imposta la sessione come permanente, l'impostazione predefinita è 31 giorni quando la sessione persisterà. Puoi modificare anche questo valore predefinito con session.permanent_session_lifetime. Ciò significa che la sessione persisterà anche se chiudi il browser a meno che, ovviamente, non elimini manualmente il cookie stesso.

Nel tuo caso, non sono sicuro di come stai usando le chiamate AJAX, ma in generale, quanto sopra dovrebbe valere per le sessioni di default del pallone.

Problemi correlati