2012-11-23 37 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。 –

相关问题