2012-11-23 3 views
5

저는 rsync 프로토콜을 사용하여 서버에서 로컬 시스템으로 파일을 전송하는 Python/Django 응용 프로그램을 작성하고 있습니다. 대용량 파일을 처리하므로 진행률 막대가 필수입니다. rsync 명령의 --progress 명령이이 기능을 아름답게 처리합니다. 모든 세부 진행 상황이 터미널에 표시됩니다. 웹 브라우저에서 어떻게 진행 상황을 보여줄 수 있습니까? 어떤 후크 기능이 있습니까? 또는 진행 상황을 로그 파일에 저장하고 전화를 걸고 1 분마다 업데이트 할 수 있습니까?DJango를 사용하여 웹 브라우저에서 rsync --progress를 표시하는 방법은 무엇입니까?

+0

브라우저가 rsync 또는 웹 브라우저를 통해 서버와 대화하고 있습니까? 한 번에 둘 다? –

답변

5

기본 원리는 하위 프로세스에서 실행 rsync를하는 것입니다, 웹 API를 노출하고

여기 예제가 자바 스크립트를 통해 업데이트를 얻을.

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을 통해 사용할 수 있습니다.

고객 측에서는 수시로 progress webservice/API에 연락하여 javascript (ajax)를 작성하고 해당 정보를 사용하여 클라이언트 측에 뭔가를 제공합니다. 문자 메시지, 이미지 너비, 일부 div 색상 등

+0

답변 해 주셔서 감사합니다. 웹 서비스/API는 어디에서 사용할 수 있습니까? – sachitad

+0

API 작성은 기존의보기 기능 작성과 다를 바 없습니다. 예를 들어 - http://nathanborror.com/posts/2008/aug/11/creating-basic-api-django/ django-tastypie와 같은 "API 프레임 워크"를 사용하고자 할 수 있습니다. –

관련 문제