2009-10-27 9 views
9

Ho Django in esecuzione in Apache tramite mod_wsgi. Credo che Django stia memorizzando nella cache le mie pagine lato server, il che sta causando il mancato funzionamento di alcune funzionalità.Come disabilitare la pagina di Django/mod_WSGI Caching

Ho un timer per il conto alla rovescia che funziona recuperando l'ora del server corrente, determinando il tempo rimanente del conto alla rovescia e inviando quel numero al modello HTML. Un timer per il conteggio alla rovescia javascript riprende e esegue il conto alla rovescia per l'utente.

Il problema sorge quando l'utente aggiorna la pagina o naviga verso una pagina diversa con il timer per il conto alla rovescia. Il timer sembra saltare saltuariamente in tempi diversi, di solito tornando alla stessa ora più e più volte su ogni aggiornamento.

Utilizzando HTTPFox, la pagina non viene caricata dalla cache del browser, quindi sembra che Django o Apache stiano memorizzando nella cache la pagina. C'è un modo per disabilitare questa funzionalità? Non avrò abbastanza traffico da preoccuparmi di mettere in cache l'output dello script. O mi sbaglio del tutto sul perché questo sta accadendo?

[Modifica] Dai post seguenti, sembra che il caching sia disabilitato in Django, il che significa che deve essere in corso altrove, forse in Apache?

[Modifica] Ho una descrizione più approfondita di ciò che sta accadendo: per le prime 7 (o così) richieste fatte al server, le pagine sono renderizzate dallo script e restituite, anche se ognuna di quelle 7 pagine sembra essere memorizzato nella cache come si presenta più tardi. All'ottava richiesta, il server serve la prima pagina. Alla nona richiesta, serve la seconda pagina e così via in un ciclo. Questo dura fino al riavvio di apache, quando il processo ricomincia.

[Modifica] Ho configurato mod_wsgi per eseguire solo un processo alla volta, il che fa sì che il timer ripristini lo stesso valore in ogni caso. È interessante notare che c'è un altro componente sulla mia pagina che visualizza un'immagine casuale su ogni richiesta, usando l'ordine ('?'), E che si aggiorna ogni volta con immagini diverse, il che indicherebbe che la cache sta accadendo in Django e non in Apache.

[Modifica] Alla luce della modifica precedente, sono tornato indietro e ho esaminato il file views.py pertinente, trovando che la variabile di inizio del conto alla rovescia veniva impostata globalmente nel modulo, al di fuori delle funzioni di visualizzazione. Lo spostamento di questa impostazione all'interno delle funzioni di visualizzazione ha risolto il problema. Dopotutto, si è scoperto che non si trattava di un problema di memorizzazione nella cache. Grazie a tutti per il vostro aiuto su questo.

+0

http://www.djangobook.com/en/2.0/chapter15/ – cwallenpoole

risposta

6

Dalla mia esperienza con mod_wsgi in Apache, è altamente improbabile che stanno causando la memorizzazione nella cache. Un paio di cose da provare:

  1. E 'possibile che avete un po' proxy server tra il computer e il server web che viene opportunamente o impropriamente caching pagine. A volte gli ISP eseguono server proxy per ridurre la larghezza di banda al di fuori della loro rete. Puoi fornire le intestazioni HTTP per una pagina che viene memorizzata nella cache (Firebug può darti queste informazioni). Le intestazioni a cui sarei particolarmente interessato sono Cache-Control, Expires, Last-Modified e ETag.
  2. Puoi pubblicare il tuo MIDDLEWARE_CLASSES dal tuo file settings.py. È possibile che tu abbia un middleware che esegue il caching per te.
  3. Puoi grep il tuo codice per i seguenti elementi "load cache", "django.core.cache" e "cache_page". A * grep -R "search" ** funzionerà.
  4. Il file settings.py (o qualsiasi cosa che importi come "da importazione localsettings *") include CACHE_BACKEND?
  5. Cosa succede quando si riavvia Apache? (ad es. sudo services apache restart). Se un riavvio risolve il problema, è possibile che apache faccia cache (è possibile che questo possa cancellare anche un backend cache Django).
+0

Sono d'accordo. Probabilmente è Apache o il tuo ISP che fa il caching. –

+0

1. Il sito è attualmente in esecuzione su un server sulla nostra rete locale, quindi non esiste un proxy. 2. MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', ) 3. Nessuna quei termini appaiono ovunque nel codice. 4. No 5. Il riavvio di Apache risolve il problema e aggiorna la cache con un nuovo valore. – Travis

1

Avete impostato in modo specifico il caching di Django? Dai documenti sembra che tu sappia chiaramente se Django stava facendo il caching in quanto richiede lavoro in anticipo per farlo funzionare. In particolare, è necessario definire dove vengono salvati i file memorizzati nella cache.

http://docs.djangoproject.com/en/dev/topics/cache/

+0

non ho fatto nulla di tutto questo lavoro preliminare, quindi suppongo che il caching di Django sia disabilitato ... Qualche idea su cos'altro potrebbe causare il problema con l'ora di inizio del timer che viene memorizzata nella cache? Potresti fare apache con mod_wsgi? – Travis

1

Si sta utilizzando una configurazione a più processi per Apache/mod_wsgi? Se lo sei, ciò spiegherà perché le diverse risposte possono avere un valore diverso per il timer, così come è probabile che quando il timer viene inizializzato sarà diverso per ogni richiesta di gestione del processo. Quindi perché può saltare in giro.

Avere una lettura di:

http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

allenarsi in quale modalità o la configurazione si esegue Apache/mod_wsgi e forse pubblicare ciò che la configurazione è. Senza saperlo, ci sono troppe incognite.

+0

httpd -V mostra che il prefork MPM è in uso. threaded: no, forked: yes (conteggio dei processi variabili) – Travis

+0

Quindi le richieste separate possono essere gestite da processi diversi e pertanto tali processi possono avere visualizzazioni distinte dei dati. Leggi anche "http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html" per i pericoli dell'uso di prefork con mod_python e mod_wsgi. –

+0

Sembra che stia succedendo. Ho modificato la configurazione per l'esecuzione in modalità Demone, limitando il numero di processi a uno, che lo ha limitato a una sola versione cache della pagina. Quindi il mio timer si reimposta allo stesso valore su ogni richiesta. Questo purtroppo non è ancora il comportamento desiderato. – Travis

2

Ho appena imbattuto in questo:

supporto per la ricarica automatici utili strumenti di distribuzione si può attivare il supporto per ricarica automatica. Ogni volta che qualcosa cambia nel file .wsgi, mod_wsgi ricarica tutti i processi demone per noi.

Per questo, basta aggiungere la seguente direttiva alla sezione di repertorio:

WSGIScriptReloading On 
+1

Questo è attivo per impostazione predefinita, quindi non dovresti preoccuparti di questo. Come viene gestito il ricaricamento è descritto in http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode –

+2

Non lo so - ma posso dire di aver usato wsgi su due macchine diverse - una con un sito web complesso basato su Django (OpenStack Dashboard/Horizon), e una con il mio possedere script più semplici - e attivando WSGIScriptReloading su ognuno ha fatto in modo che, quando ho modificato gli script, le modifiche diventassero effettive alla pagina successiva si ricaricassero senza dover riavviare Apache. – Brad

+1

Beh, posso dire che ho scritto mod_wsgi e il codice ce l'ha per impostazione predefinita. Come spiegato in quel documento che ho collegato, per la modalità incorporata sul file di script WSGI stesso viene ricaricato e non tutto il codice dell'applicazione. Dovresti ricontrollare se stai effettivamente utilizzando la modalità incorporata o la modalità daemon descritta in quel documento. Molto spesso le persone non hanno la direttiva WSGIProcrocGroup e non utilizzano la modalità demone come pensano di essere. –

Problemi correlati