2009-03-03 6 views
7

dopo aver memorizzato nella cache diverse viste sul mio progetto django - @ cache_page (60 * 5) - Ho notato che memcached memorizza nella cache l'intera vista, anche l'argomento della richiesta! Quindi se il primo utente che visita una pagina è registrato come userxyz, tutti gli altri utenti anonimi o registrati che chiederanno la stessa pagina verranno presentati con la pagina che è stata memorizzata nella cache dall'utente userxyz! Ovviamente questo non è un comportamento desiderato ... Quindi posso memorizzare tutto nella vista, ma non l'argomento della richiesta? O memcached è adatto solo per sessioni anonime?richiesta cache memcached?

Grazie in anticipo, Markos Gogoulos

risposta

6

Se stai mescolando dati dinamici e statici su una sola pagina, nel tuo caso i dati dinamici sono il login nome utente dell'utente, quindi caching delle pagine non è la scelta giusta . Questo non cambierebbe se si stesse utilizzando la cache di archiviazione basata su file invece di memcached.

Suggerisco di provare il caching del frammento. Si può fare qualcosa di simile:

{% load cache %} 
{% cache 500 sidebar %} 
    .. sidebar .. 
{% endcache %} 

Ciò memorizzare nella cache il contenuto del tag di cache per 500 secondi con la barra laterale di identificazione.

Potete trovare maggiori informazioni sul caching qui:

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


Se questa è una pagina che sta per essere colpito molto spesso, ad esempio una pagina di benvenuto, che si sente gioverebbe dall'utilizzare il caching delle pagine sulla memorizzazione nella cache dei frammenti (ad esempio, l'unico dato dinamico è il nome utente), quindi ci sono alcune altre opzioni.

Ad esempio, si desidera avere una pagina completamente statica ad eccezione di una sezione di accesso/disconnessione nella parte superiore che visualizza collegamenti diversi a seconda che l'utente abbia o meno effettuato l'accesso, quindi è possibile verificare l'esistenza di un cookie di autenticazione quando la pagina viene caricata per la prima volta e visualizza in modo condizionato dati diversi usando javascript.

2

Memcached è solo un back-end. Memorizza nella cache qualsiasi cosa tu dica. Quindi la tua domanda è davvero "La cache a pagina intera di Django è adatta per le pagine dinamiche?" Probabilmente non vuoi fare cache di pagine complete, solo una parte di esso. O solo le pagine per le richieste anonime (usando CACHE_MIDDLEWARE_ANONYMOUS_ONLY)

fare riferimento al libro http://www.djangobook.com/en/1.0/chapter13/

0

Si potrebbe voler esaminare template fragments e la memorizzazione nella cache quei pezzetti di contenuti che non sono utente specifico.