2012-12-27 10 views
6

Ho un bug strano con sessioni di Django nella mia app: alcune volte (circa 10 volte per ~ 20000 al giorno) le informazioni di sessione per l'utente viene cancellato. L'ho tracciato tramite file di log: alla pagina A ci sono informazioni per la sessione dell'utente, dopo che ha inviato il modulo e alla pagina successiva la sua sessione è vuota. Ho provato due tipi di archiviazione: memcached + solo db e db e questo problema riguarda entrambi. Ho provato a riprodurre questi scenari, ma tutto funziona come previsto, come ho detto, accade molto raramente. Ho anche verificato che questo problema esiste per utenti diversi, e per loro non si riproduce ogni volta. Non ho idee su come prendere la causa principale e non so che altro postare qui come descrizione. Se qualcuno ha qualche idea, per favore fatemelo sapere. Se è importante, eseguo la mia app con django 1.2 + FastCGI. Grazie!questione spinosa con le sessioni di Django: a volte le informazioni di sessione viene cancellata

UPD: Ho controllato e visto che la chiave di sessione dagli usi non è cambiata durante due richieste sequenziali, alla prima richiesta c'è uno stato di sessione reale e alle variabili di seconda sessione sono relazionate con vuoto.

+0

Usi qualsiasi javascript che può originare richieste concorrenti in modo che entrambi possano modificare la sessione? – hynekcer

+0

@hynekcer, nessuna sessione non viene aggiornata nelle chiamate da JS. – dbf

+0

Sei sicuro di non utilizzare il multithreading in FastCGI? (Se imposti FCGI_MAX_CONNS = 1, FCGI_MAX_REQS = 1, FCGI_MPXS_CONNS = 0, puoi essere sicuro di utilizzare solo un singolo thread, indipendente dalle implementazioni fastcgi che usi: [Specifica FastCGI] (http://www.fastcgi.com/drupal/node/6? q = node/22)) Quindi suggerisco di registrare l'id del processo per vedere se può essere cancellato solo dallo stesso processo o solo da un processo differente. (Usa "% (processo) d" nella stringa del formato di registrazione o nella funzione "os.getpid()".) – hynekcer

risposta

4

Come un modo per eseguire il debug di questo problema, avrei sottoclasse il Django sessione di middleware standard (o qualsiasi altra cosa si sta attualmente utilizzando):

django.contrib.sessions.middleware.SessionMiddleware

e avvolgere process_request e (probabilmente più importante) process_response in qualche registrazione aggiuntiva. Quindi installa il middleware di sessione sottoclasse nel numero MIDDLEWARE_CLASSES, anziché nel Django di serie.

Si potrebbe anche verificare che session.save() ha effettivamente commesso i suoi cambiamenti, cercando di leggere di nuovo. Può darsi che il problema risieda nella serializzazione dello stato di sessione e che non funzioni su una particolare chiave o valore che stai tentando di archiviare.

Nessuno di questi risolverà il problema, ma potrebbe aiutarti a stabilire cosa sta succedendo.

4

Come accennato @Steve Mayne, sarebbe bene fare un po 'la registrazione del modello sessioni di middleware e le sessioni di metodo di salvataggio. È qualcosa con cui inizierei.

Inoltre mi piacerebbe dire che questo potrebbe essere un problema relativo banca dati, soprattutto se si sta utilizzando MySQL database back-end per le sessioni. È possibile controllare il registro per i blocchi del database e altri problemi di concorrenza. Prima ho dovuto affrontare problemi simili e la soluzione è chiara: ottimizzazione e prestazioni aggiuntive.

Se si dispone di alcuni middleware applicativi specifici, è possibile verificare la funzionalità che interferisce con le sessioni di Django. Tali operazioni parallele possono causare problemi, se non implementati correttamente.

Un'altra cosa che vorrei fare è di aggiornare all'ultima versione stabile di Django e migrare verso una configurazione mod_wsgi.

Problemi correlati