Aggiorna HttPresponse ogni pochi secondi
-
20-09-2019 - |
Domanda
La mia applicazione in Django Potere Crea un po ' molto Grandi domande SQL. Attualmente uso un HttpRequest
oggetto, per i dati di cui ho bisogno, quindi a HttpResponse
, per restituire ciò che voglio mostrare l'utente.
Ovviamente, posso lasciare che l'utente attenda un minuto mentre queste serie di query vengono eseguite ed estratte dal database, quindi restituire questa pagina HTML monolotica.
Idealmente, vorrei aggiornare la pagina quando voglio, qualcosa del tipo:
For i,e in enumerate(example):
Table.objects.filter(someObjectForFilter[i]).
#Return the object to the page.
#Then Loop again, 'updating' the response after each iteration.
È possibile?
Soluzione
Ho scoperto di recente che un HttPresponse può essere un generatore:
def myview(request, params):
return HttpResponse(mygenerator(params))
def mygenerator(params):
for i,e in enumerate(params):
yield '<li>%s</li>' % Table.objects.filter(someObjectForFilter[i])
Ciò restituirà progressivamente i risultati di mygenerator
alla pagina, avvolto in un HTML <li>
per il display.
Altri suggerimenti
Il tuo approccio è un po 'imperfetto. Hai alcune opzioni diverse.
Il primo è probabilmente il più semplice: usa Ajax e HttPrequest. Avere una serie di questi, ognuno dei quali si traduce in un singolo Table.objects.filter(someObjectForFilter[i]).
. Al termine di ciascuno, lo script completa e restituisce i risultati al client. Il client aggiorna l'interfaccia utente e avvia la domanda successiva tramite un'altra chiamata AJAX.
Un altro metodo è utilizzare un sistema batch. Questo è un po 'più pesante, ma probabilmente un design migliore se stai andando per un vero "sollevamento pesante" nel database. Dovrai avere un demone batch in esecuzione (una sonda Cron funziona bene per questo) per le attività in arrivo. L'utente desidera eseguire qualcosa, quindi la loro richiesta presenta questa attività (potrebbe essere semplicemente una riga in un database con i loro parametri). Il demone lo afferra, lo elabora completamente offline - forse anche da una macchina diversa - e aggiorna la riga delle attività quando è completa dei risultati. Il client può quindi aggiornare periodicamente per verificare lo stato di quella riga, tramite metodi tradizionali o AJAX.