2012-11-23 76 views
5

我正在編寫一個使用rsync協議將文件從服務器傳輸到本地計算機的Python/Django應用程序。我們將處理大文件,因此進度欄是強制性的。 rsync命令中的--progress參數可以很好地執行此操作。所有的細節進展都顯示在終端中。如何顯示Web瀏覽器的進度?有沒有鉤子功能或類似的東西?或者我可以將進度存儲在日誌文件中,調用它並每隔一分鐘更新一次?如何使用DJango顯示網頁瀏覽器中的rsync --progress?

+0

瀏覽器是通過rsync還是通過網絡瀏覽器與服務器通話?兩者同時? –

回答

5

的基本原理是在子運行rsync的,公開Web API並獲取即時更新通過JavaScript

下面是一個例子。

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

但是,這隻顯示我們在標準輸出(stdout)中的進展。

我們可以但是,修改此代碼返回進步爲JSON輸出,並且可以通過我們創建一個progress webservice/API可以提供這種輸出。

在客戶端使用,我們會寫javascript(ajax)來不時地聯繫我們的progress webservice/API,並使用該信息更新客戶端的一些信息,例如,文本消息,圖像寬度,某些div的顏色等

+0

謝謝你的回答。 Web服務/ API可用在哪裏? – sachitad

+0

創建API與創建傳統視圖函數沒有區別。下面是一個例子 - http://nathanborror.com/posts/2008/aug/11/creating-basic-api-django/ 儘管你可能想使用「API框架」,比如django-tastypie。 –

相關問題