python - 如何使用 DJango 在网络浏览器中显示 rsync --progress?

标签 python django rsync

我正在编写一个 Python/Django 应用程序,它使用 rsync 协议(protocol)将文件从服务器传输到本地机器。我们将处理大文件,因此进度条是强制性的。 --progress rsync 命令中的参数可以很好地做到这一点。所有详细进度都显示在终端中。我如何在网络浏览器中显示该进度?有没有钩子(Hook)函数之类的?或者我可以将进度存储在日志文件中,调用它并每隔一分钟左右更新一次吗?

最佳答案

基本原理是在子进程中运行 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 的颜色等

关于python - 如何使用 DJango 在网络浏览器中显示 rsync --progress?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13523931/

相关文章:

django memcached 设置位置列表有元组吗?

windows - 为什么此 rsync 连接在 Windows 上意外关闭?

linux - rsync:如何向远程端验证用户身份

linux - 如何更改 Rsync 服务器上的文件历史记录

python - 如何从OpenCV calcOpticalFlowFarneback中提取像素的速度矢量-Python版本)

python - Zeep - 关闭主机验证

python - 为什么在Django单元测试期间我的表不可用?

python - 导入错误 : No module named grid_search, learning_curve

python - 如何获取从用户输入输入的变量的值?

django - 使用 post_save 信号处理程序访问新创建的模型实例的相关数据