2012-11-23 8 views
5

Ich schreibe eine Python/Django-Anwendung, die Dateien mit dem rsync-Protokoll vom Server auf den lokalen Rechner überträgt. Wir werden uns mit den großen Dateien beschäftigen, daher ist der Fortschrittsbalken obligatorisch. --progress Argument in rsync Befehl macht dies schön. Alle Detailfortschritte werden im Terminal angezeigt. Wie kann ich diesen Fortschritt im Webbrowser zeigen? Gibt es irgendeine Hook-Funktion oder etwas ähnliches? Oder kann ich den Fortschritt in einer Protokolldatei speichern, aufrufen und jede Minute aktualisieren?Wie man den rsync - Fortschritt im Webbrowser mit DJango zeigt?

+0

Spricht der Browser mit dem Server über Rsync oder über einen Webbrowser? beides auf einmal? –

Antwort

5

Das Grundprinzip ist Lauf rsync in subprocess, eine Web-API belichten und erhalten Updates via Javascript

Hier ein Beispiel ist.

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') 

Aber dies nur zeigt uns den Fortschritt in unserer Standardausgabe (stdout).

Wir können diesen Code jedoch ändern, um den Fortschritt als JSON-Ausgabe zurückzugeben, und diese Ausgabe kann über eine von uns erstellte progress webservice/API zur Verfügung gestellt werden.

Auf der Client-Seite verwenden, werden wir dann Javascript (Ajax) schreiben, um unsere progress webservice/API von Zeit zu Zeit zu kontaktieren, und mit dieser Info-Aktualisierung etwas Client-Seite z. ein Text msg, Breite eines Bildes, Farbe einiger div etc

+0

Vielen Dank für Ihre Antwort. Wo ist Webservice/API verfügbar? – sachitad

+0

Das Erstellen einer API unterscheidet sich nicht vom Erstellen einer herkömmlichen Ansichtsfunktion. Hier ist ein Beispiel - http://nathanborror.com/posts/2008/aug/11/creating-basic-api-django/ Sie möchten vielleicht ein "API Framework" wie Django-tastypie obwohl. –

Verwandte Themen