2009-10-22 12 views
5

Ho recentemente implementato il caching in tutto il sito utilizzando memcached sulla mia applicazione Django, ho impostato il TTL a circa 500 secondi e implementato cache per visualizzazione su altre parti di l'applicazione web.Caching a livello di sito con Django - problemi con pagine protette da password al logout

Il problema che ho è che quando un utente si disconnette, perché è un post modulo il sito si comporta come previsto, se hanno poi andare ad una parte protetta da password del sito, l'applicazione si comporta come se fossero ancora registrati in, a meno che non premano "Aggiorna". Sono nuovo nel caching e mi chiedo se posso fare qualcosa di intelligente per impedirlo?

risposta

7

mi sono imbattuto in problemi simili. Il modo standard Django è disabilitare la cache per gli utenti autenticati.

#settings.py 
CACHE_MIDDLEWARE_ANONYMOUS_ONLY=True 

Funziona bene se diversi utenti vedere pagine diverse (ad esempio: il loro nome utente su di loro) e non è possibile avere una versione per loro.

Ma se ci sono solo 2 versioni di pagina: per gli utenti autenticati e per gli altri, non è opportuno disattivare completamente la cache per gli utenti autenticati. Ho scritto uno app che, oltre a tutto, rende possibile mettere a punto la cache in questo caso.

Aggiornamento

.

BTW: hai detto che quando fai clic su "Aggiorna" viene ricevuta la versione corretta della pagina. Significa che il problema è la cache lato client (Expires header o E-tag), non la cache del server.

Per impedire il caching sul lato client (è necessario farlo se si dispone di diverse versioni di pagina con lo stesso URL) utilizzare @cache_control(must_revalidate=True) decoratore.

+0

Per curiosità, la tua app funziona se ho 3 versioni anziché due? (Anonimo, autenticato, personale)? – Powerlord

+0

Sì. Può essere usato per avere diverse versioni di pagine basate su qualsiasi cosa su richiesta. Ciò significa che è possibile avere pagine memorizzate nella cache per utente o pagine memorizzate nella cache dall'attributo dell'utente o pagine memorizzate nella cache dai cookie. –

+0

.. o pagine memorizzate dai parametri GET –

1

Nella vista di una parte del sito protetta da password, si controlla se l'utente è registrato o anonimo prima di recuperare i dati (e magari di portare dati dalla cache)?

Si dovrebbe. Django ti aiuta, con un decoratore richiesto per l'accesso che puoi posizionare sulla vista. Date un'occhiata a questo: http://docs.djangoproject.com/en/dev/topics/auth/#the-login-required-decorator

+0

Sì, lo faccio, tutto ha un decoratore richiesto per l'accesso, il problema è che lo stato di login è memorizzato nella cache. –

+0

Ma è chiaro se si preme "Aggiorna". –

Problemi correlati