2012-11-23 15 views
5

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?

+0

Il browser sta parlando al server tramite rsync o tramite un browser web? entrambi contemporaneamente? –

risposta

5

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

+0

Grazie per la risposta. Dov'è disponibile il servizio web/API? – sachitad

+0

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. –

Problemi correlati