2010-09-27 19 views
8

Sto tentando di memorizzare nella cache i risultati delle query sulla mia app django. Tuttavia, sembra che stia memorizzando nella cache l'intera app. Ho provato seguente logi:Come memorizzare nella cache il risultato della query in django?

def cacheView(): 
    result = cache.get('key') 
    if result is None: 
    result = Model.objects.get(id=1) 
    cache.set('key', 'result') 

io chiamo questo metodo quando utente effettua Tuttavia, se si tenta di effettuare il logout dopo il login, mi tiene sulla stessa pagina come se sto ancora collegato ho cercato di seguire.. la documentazione di Django sulla cache al http://docs.djangoproject.com/en/1.2/topics/cache/ ma senza successo.

Un'altra cosa che ho provato è che se si tenta di utilizzare il decoratore di cache appena sopra la vista come:

@cache_control(max_age=1000) 
def cacheView(): 
... 

lo fa dà un errore che dice "header di risposta non definito". Sono nuovo di Django e sicuro di aver perso qualcosa. Qualche idea?

risposta

8

RTFM :) Ufficiale Django Documenti: Caching and QuerySets

Ogni QuerySet contiene una cache, per ridurre al minimo l'accesso al database. (...)

e:

In un QuerySet di nuova creazione, la cache è vuota. La prima volta che un oggetto QuerySet viene valutato e, quindi, viene eseguita una query sul database, Django salva i risultati della query nella cache di QuerySet e restituisce i risultati che sono stati esplicitamente richiesti (ad esempio, l'elemento successivo, se QuerySet viene iterato al di sopra di). Le valutazioni successive di QuerySet riutilizzano i risultati memorizzati nella cache.

Caching è fatto automagicamente in caso di querysets (risultati di query).

MODIFICA: Per quanto riguarda il codice incollato nella domanda. Se la chiave non esiste già nella cache, devi crearla con il metodo add() ma ricorda che scadrà di default dopo 30 secondi. Se si desidera che sia mantenuto più a lungo, è necessario aggiungere l'opzione di timeout al metodo add()/set().

Se si desidera memorizzare nella cache per intero il sito (ad esempio decoratori come li hai utilizzati), è necessario aggiungere il middleware appropriato al tuo MIDDLEWARE_CLASSES in settings.py (in questo ordine esatto, perché l'ordine del middleware è importante, è caricati uno per uno come loro si definiscono):

MIDDLEWARE_CLASSES = (
    # ... 
    'django.middleware.cache.UpdateCacheMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.cache.FetchFromCacheMiddleware', 
    # ... 
) 

Se non li avete, allora vi troverete a ricevere errori di intestazione male ogni volta che userete funzionalità di caching-per-site.

+0

ho sicuramente perso che sul manuale. Ora che so che memorizza nella cache il queryset, la mia prossima domanda sarebbe quale metodo di cache usa. Perché volevo archiviare questo in Memcache che ho configurato nel mio settings.py ma non sono sicuro che django prenderà quel metodo o userà la cache del database? – jindals

+0

Per impostazione predefinita, django utilizza la memoria locale per memorizzare la cache. Se hai impostato un altro backend cache allora django lo userà. – bx2

+0

Un'altra domanda: è necessario memorizzare questi dati per un tempo molto lungo? – bx2

1

Dal tuo esempio non è chiaro il motivo per cui il logout fallirebbe, ma non dovrebbe essere nulla a che fare con la memorizzazione nella cache di un modello (a meno che non si memorizzi il modello utente nella cache e si utilizzi l'utente memorizzato nella cache invece di request.user ?)

Va bene usare cache.get e cache.set come sei (il set creerà una nuova chiave se non esiste).

Le query nella cache possono essere difficili in quanto è necessario fare attenzione a invalidare la cache quando i dati cambiano in modo da non offrire risultati obsoleti.

Avere uno sguardo a queste librerie di query-cache per Django, che mirano a rendere le cose più facili:

http://jbalogh.me/2010/02/09/cache-machine/

http://packages.python.org/johnny-cache/queryset_cache.html

+1

non hai bisogno di librerie aggiuntive finché sai cosa stai facendo e cosa vuoi realizzare - non c'è niente di più facile (e più complicato allo stesso tempo) rispetto al caching. – bx2

Problemi correlati