2012-11-23 27 views
5

Tôi đang viết một ứng dụng Python/Django chuyển tệp từ máy chủ sang máy cục bộ bằng giao thức rsync. Chúng tôi sẽ xử lý các tệp lớn để thanh tiến trình là bắt buộc. --progress đối số trong rsync lệnh thực hiện điều này thật đẹp. Tất cả các tiến trình chi tiết được hiển thị trong thiết bị đầu cuối. Làm thế nào tôi có thể cho thấy sự tiến bộ đó trong trình duyệt web? Có chức năng móc hay gì đó như thế không? Hoặc tôi có thể lưu trữ tiến trình trong một tệp nhật ký, gọi nó và cập nhật nó mỗi một phút hoặc lâu hơn?Cách hiển thị rsync --progress trong trình duyệt web bằng DJango?

+0

Trình duyệt có đang nói chuyện với máy chủ qua rsync hoặc qua trình duyệt web không? cả hai cùng một lúc? –

Trả lời

5

Nguyên tắc cơ bản là để chạy rsync trong tiến trình con, phơi bày một API web và nhận được cập nhật thông qua javascript

Dưới đây là một ví dụ.

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

Nhưng điều này chỉ cho chúng ta thấy tiến độ trong đầu ra tiêu chuẩn của chúng tôi (stdout).

Tuy nhiên, chúng tôi có thể sửa đổi mã này để trả về tiến trình dưới dạng đầu ra JSON và đầu ra này có thể được cung cấp qua progress webservice/API mà chúng tôi tạo.

Khi sử dụng phía máy khách, sau đó chúng tôi sẽ viết javascript (ajax) để liên hệ với chúng tôi progress webservice/API và sử dụng thông tin đó cập nhật mặt khách hàng nào đó, ví dụ: tin nhắn văn bản, chiều rộng của hình ảnh, màu sắc của một số div, v.v.

+0

Cảm ơn bạn đã trả lời. API webservice/API có sẵn ở đâu? – sachitad

+0

Tạo một API không khác với việc tạo ra một chức năng xem truyền thống. Dưới đây là ví dụ - http://nathanborror.com/posts/2008/aug/11/creating-basic-api-django/ Bạn có thể muốn sử dụng "Khung API" chẳng hạn như django-tastypie. –

Các vấn đề liên quan