Sto scrivendo un'applicazione Python/Django che trasferisce i file dal server alla macchina locale utilizzando il protocollo rsync. Ci occuperemo dei file di grandi dimensioni quindi la barra di avanzamento è obbligatoria. L'argomento --progress
nel comando rsync
lo fa magnificamente. Tutti i dettagli del progresso sono mostrati nel terminale. Come posso mostrare che progressi nel browser web? C'è qualche funzione di aggancio o qualcosa del genere? Oppure posso memorizzare i progressi in un file di registro, chiamarlo e aggiornarlo ogni minuto o così?Come mostrare rsync --progress nel browser web usando DJango?
risposta
Il principio di base è quello di run rsync in sottoprocesso, esporre un'API web e ottenere gli aggiornamenti tramite javascript
ecco un esempio.
import subprocess
import re
import sys
print('Dry run:')
cmd = 'rsync -az --stats --dry-run ' + sys.argv[1] + ' ' + sys.argv[2]
proc = subprocess.Popen(cmd,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,)
remainder = proc.communicate()[0]
mn = re.findall(r'Number of files: (\d+)', remainder)
total_files = int(mn[0])
print('Number of files: ' + str(total_files))
print('Real rsync:')
cmd = 'rsync -avz --progress ' + sys.argv[1] + ' ' + sys.argv[2]
proc = subprocess.Popen(cmd,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,)
while True:
output = proc.stdout.readline()
if 'to-check' in output:
m = re.findall(r'to-check=(\d+)/(\d+)', output)
progress = (100 * (int(m[0][1]) - int(m[0][0])))/total_files
sys.stdout.write('\rDone: ' + str(progress) + '%')
sys.stdout.flush()
if int(m[0][0]) == 0:
break
print('\rFinished')
Ma questo ci mostra solo il progresso nel nostro standard output (stdout
).
Possiamo tuttavia modificare questo codice per restituire l'avanzamento come output JSON e questo output può essere reso disponibile tramite uno progress webservice/API
che creiamo.
Per quanto riguarda l'utilizzo da parte del cliente, scriveremo javascript (ajax) per contattare il nostro progress webservice/API
di tanto in tanto e utilizzando quell'aggiornamento di informazioni su qualcosa lato client, ad es. un messaggio di testo, la larghezza di un'immagine, il colore di alcuni div ecc
Grazie per la risposta. Dov'è disponibile il servizio web/API? – sachitad
La creazione di un'API non è diversa dalla creazione di una funzione di visualizzazione tradizionale. Ecco un esempio: http://nathanborror.com/posts/2008/aug/11/creating-basic-api-django/ Si potrebbe desiderare di utilizzare un "Framework API" come django-tastypie. –
- 1. Django - display action progress
- 2. non può mostrare lettere greche nel browser
- 3. Non mostrare le directory in uscita rsync
- 4. come eseguire un'applet java nel browser web
- 5. Come posso aprire un sito web nel mio browser web usando Python?
- 6. animateWithDuration: corrompe progress progress smooth
- 7. JQuery differito. Usando $ .when e .progress()
- 8. Rsync su SSH - timeout in ssh o rsync?
- 9. RStudio apre la documentazione nel browser web
- 10. Evidenziamento ortografico Controllo ortografia nel browser web
- 11. equivalente pdb.set_trace() nel browser web javascript?
- 12. LinkLabel ... aperto nel browser Web predefinito?
- 13. Come ottenere il browser sessionId usando il selettore web Selenium
- 14. Come per rilevare un browser che non sosterrà XHR2 Upload Progress
- 15. Come rsync alle cartelle locali da una vista Django
- 16. Come ancorare gli strumenti di sviluppo nel browser Web Vivaldi?
- 17. Come disabilitare 'Incolla' nel browser Android usando JQuery?
- 18. Progress bar (e-mail)
- 19. gradienti Riflessione usando i CSS nel browser di Android
- 20. rsync
- 21. CURL Progress - Mostra Percentuale
- 22. Come modificare il proprietario per un rsync
- 23. plain gwt progress wheel
- 24. browser web sito timeout
- 25. Logstash log tail nel browser
- 26. Restituisce tutti gli attributi di un HtmlElement nel browser Web
- 27. Desidero utilizzare i comandi di tipo VI nel browser Web?
- 28. come faccio a mostrare una stringa come contenuto HTML nel modulo web
- 29. Come posso ottenere un livello topojson da mostrare nel volantino usando d3?
- 30. Mostrare e nascondere usando $ rootscope
Il browser sta parlando al server tramite rsync o tramite un browser web? entrambi contemporaneamente? –