2012-11-23 33 views
5

Rsync protokolünü kullanarak dosyaları sunucudan yerel makineye aktaran bir Python/Django uygulaması yazıyorum. Büyük dosyalar ile ilgileneceğiz, böylece ilerleme çubuğu zorunludur. --progress argümanında rsync komutu bunu güzelce yapar. Tüm detay ilerlemeler terminalde gösterilir. Web tarayıcısında bu ilerlemeyi nasıl gösterebilirim? Herhangi bir kanca işlevi veya böyle bir şey var mı? Veya ilerlemeyi bir günlük dosyasına kaydedebilir, arayabilir ve her dakikada bir güncelleyebilir miyim?DJango kullanarak web tarayıcısında rsync --progress nasıl gösteriliyor?

+0

Tarayıcı rsync veya bir web tarayıcısı üzerinden sunucuyla mı konuşuyor? ikisi de aynı anda mı? –

cevap

5

temel prensibi alt süreç olarak çalıştırmak rsync etmek, bir web API teşhir ve

İşte bir örnek javascript aracılığıyla güncelleme olsun.

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

Ama bu sadece bizim standart çıkışa (stdout) ilerleme gösterir.

Ancak, JSON çıktı olarak ilerlemeyi dönmek için bu kodu değiştirebilir ve bu çıkış yarattığımız bir progress webservice/API yoluyla ulaşılabilir hale getirilebilir.

İstemci tarafında kullanım için, zaman zaman progress webservice/API numaralı telefon numaramızla iletişim kurmak için javascript (ajax) yazacağız ve bu bilgileri kullanarak istemci tarafında bir şey güncelleme yapacağız. bir metin msg, bir görüntünün genişliği, bazı boşlukların rengi vb.

+0

Cevabınız için teşekkür ederiz. Web hizmeti/API nerede kullanılabilir? – sachitad

+0

Bir API oluşturmak, geleneksel bir görünüm işlevi oluşturmaktan farklı değildir. http://nathanborror.com/posts/2008/aug/11/creating-basic-api-django/ Gerçi bu tür django-tastypie gibi bir "API Framework" kullanmak isteyebilirsiniz - İşte bir örnek. –

İlgili konular