2013-01-16 18 views
6

Questa potrebbe essere una domanda python. È un noobish per essere sicuro.django precarica e memorizza nella cache una vista

Un client richiede una pagina di calcolo [pagina-1] e alla fine richiederà una seconda pagina di calcolo [pagina-2], che può essere calcolata nell'istanza in cui è nota la richiesta per page-1. Non voglio calcolare ogni set di dati prima di servire pagina 1 perché rallenterebbe in modo significativo le prestazioni della risposta iniziale.

Desidero calcolare il valore per pagina-2 mentre il client legge pagina-1. Il client potrebbe anche fare clic su alcuni pulsanti che causano una risposta che fornisce una visualizzazione diversa dei dati della pagina 1, ma non richiedono un calcolo intensivo. Alla fine, ma non necessariamente immediatamente, il client chiederà la pagina 2 e voglio essere in grado di rispondere con una risposta pre-renderizzata.

Come posso fare?

+0

che ci si vuole innescare una funzione asincrona che calcola la pagina 2 in base alle informazioni di pagina1, memorizzandola in una cache (o ovunque), quindi a pagina 2: esegue continuamente il polling di una vista che sa di verificare una determinata chiave nella cache in modo da determinare quando l'attività in background è terminata calcolo del task step2. –

+0

Non ho idea di come farlo. Qualsiasi piccola guida sarebbe di grande aiuto. – Cole

+1

Mi dispiace, non posso entrare in molti più dettagli senza scrivere un tema. Fondamentalmente, è necessario attivare questa funzione costosa non appena client1 leggere la pagina. Se non si desidera che il client lo attenda prima di caricare la pagina, è necessario eseguire il lavoro in modo asincrono. Un compito in background. Quindi, a pagina 2, è necessario considerare la possibilità che il lavoro in background NON sia ancora completato. Pertanto, la seconda pagina deve disporre di un meccanismo per eseguire il polling continuo del server fino al completamento dell'attività BG, a quel punto è possibile mostrare la pagina2 all'utente. –

risposta

7

Come menzionato nei commenti, sembra che sarà necessario gestirlo con un'attività di background asincrona, salvando il risultato nello Django low level cache. Personalmente utilizzerei celery per la coda delle attività.

In sostanza, dopo la richiesta della prima pagina, è necessario aggiungere un'attività asincrona per avviare i calcoli della pagina 2, memorizzando il risultato nella cache. Pertanto, quando viene richiesta la pagina 2, si controlla la risposta pre-rendering nella cache e, se non esiste, è possibile calcolare il valore in modo sincrono.

Così, il vostro codice sarebbe simile a questa (l'operazione sarebbe in un file task.py nella vostra applicazione, ma questo dovrebbe darvi un'idea generale):

from celery import task 
from django.core.cache import cache 

def page_two_calculation(arg1, arg2): 
    return arg1 + arg2 

@task 
def page_two_task(arg1, arg2): 
    result = page_two_calculation(arg1, arg2) 
    cache_key = "page-two-%s-%s" (arg1, arg2) 
    cache.set(cache_key, result) 

def page_one(request, arg1, arg2): 

    # Start the page two task 
    page_two_task.delay(arg1, arg2) 

    # Return the page one response 
    return HttpResponse('page one') 

def page_two(request, arg1, arg2) 
    cache_key = "page-two-%s-%s" (arg1, arg2) 
    result = cache.get(cache_key) 
    if result is None: 
     # the result will only be None if the page 2 calculation 
     # doesn't exist in the cache, in which case we'll have to 
     # return the value synchronously. 
     result = page_two_calculation(arg1, arg2) 
    return result 
Problemi correlati