2009-10-10 15 views
6

Ho una funzione controllata dall'amministratore (database di importazione) che può richiedere del tempo per finire, quindi voglio mostrare un feedback all'utente durante quel periodo - per esempio una barra di avanzamento, o solo un po ' messaggi. Anche l'invio della pagina in parti durante la lunga azione sarebbe sufficiente.Django - display action progress

Quale sarebbe il modo più semplice per farlo in Django?

+0

perché non Progress Bar? .. si può elaborare un po ', per favore? – 0100110010101

+0

La barra di avanzamento andrebbe bene, ma non so come potrei controllarla dalla funzione che esegue l'azione – hmp

risposta

1

Non c'è modo di farlo senza una sorta di script sul lato client, ad esempio Ajax. È necessario qualcosa che esegua il polling del server a intervalli regolari e mostri una risposta all'utente. C'è a snippet che mostra come ciò potrebbe essere fatto.

Naturalmente, per rendere ciò possibile, è necessario anche effettuare il trasferimento dell'importazione stessa in un processo offline. Ciò farebbe l'importazione e registrerà il suo progresso da qualche parte regolarmente (in un file o nel database) in modo che l'Ajax possa interrogarlo. Un buon modo per farlo potrebbe essere utilizzare celery, la coda di attività distribuita basata su Django.

Infine, avrete bisogno di una semplice vista che l'Ajax chiamerà, che interrogherà il processo di lunga durata (o guarderà il record di avanzamento che crea) e riporterà al client.

Quindi, abbastanza complicato.

3
  1. Polling Ajax - Utilizzando un timer lato client, si esegue costantemente il polling del server sul relativo stato. Il processo è come questo: l'utente configura i dettagli del database e fa clic su "carica". Il trasferimento dei file e la richiesta di pagina avvia un processo asincrono sul server per eseguire l'importazione del database. Quando l'utente fa clic su upload, avvia un timer lato client che a intervalli regolari invia una richiesta AJAX al server per chiederne l'avanzamento. Il server restituisce JSON e lo script lato client individua ciò che vuole fare con esso.

  2. COMET - Non ho familiarità con questo, ma AJAX tradizionale funziona dal client che invia una richiesta al server. È noto come comunicazione "pull". In COMET, è spinta. Il server trasferisce i dati al client in merito all'avanzamento, anche se il server non lo ha richiesto. Questo crea una situazione con meno sforzo sul server rispetto al polling. Google mostra alcuni risultati per le persone che usano COMET with Django.

  3. Reverse AJAX - Simile a COMET. Reverse Ajax with Django.

(mi scuso, so minimamente gli ultimi 2, ma ho pensato che ci piacerebbe almeno sapere che esistono)