2012-11-23 17 views
5

मैं एक पाइथन/Django एप्लिकेशन लिख रहा हूं जो सर्वर से फ़ाइलों को स्थानीय मशीन पर rsync प्रोटोकॉल का उपयोग कर स्थानांतरित करता है। हम बड़ी फाइलों से निपटेंगे ताकि प्रगति पट्टी अनिवार्य हो। --progressrsync कमांड में तर्क यह खूबसूरती से करता है। सभी विस्तार प्रगति टर्मिनल में दिखाए जाते हैं। मैं वेब ब्राउजर में प्रगति कैसे दिखा सकता हूं? क्या कोई हुक फ़ंक्शन या ऐसा कुछ है? या क्या मैं प्रगति को लॉग फ़ाइल में संग्रहीत कर सकता हूं, इसे कॉल कर सकता हूं और हर एक मिनट या उससे भी अपडेट कर सकता हूं?dsango का उपयोग कर वेब ब्राउज़र में rsync - प्रगति को कैसे दिखाएं?

+0

क्या ब्राउज़र rsync के माध्यम से या वेब ब्राउज़र के माध्यम से सर्वर से बात कर रहा है? दोनों एक बार में? –

उत्तर

5

बुनियादी सिद्धांत उपप्रक्रिया में रन rsync करने के लिए है, एक वेब एपीआई का पर्दाफाश और जावास्क्रिप्ट के माध्यम से

यहाँ एक उदाहरण है अपडेट प्राप्त करें।

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) में प्रगति को दर्शाता है।

हालांकि, हम जेएसओएन आउटपुट के रूप में प्रगति को वापस करने के लिए इस कोड को संशोधित कर सकते हैं और यह आउटपुट progress webservice/API के माध्यम से उपलब्ध कराया जा सकता है।

क्लाइंट साइड उपयोग पर, हम समय-समय पर हमारे progress webservice/API से संपर्क करने के लिए जावास्क्रिप्ट (AJAX) लिखेंगे, और उस जानकारी का उपयोग करके कुछ क्लाइंट साइड अपडेट करें। एक पाठ संदेश, छवि की चौड़ाई, कुछ div आदि का रंग

+0

आपके उत्तर के लिए धन्यवाद। Webservice/API कहां उपलब्ध है? – sachitad

+0

एक एपीआई बनाना पारंपरिक दृश्य फ़ंक्शन बनाने से अलग नहीं है। यहां एक उदाहरण दिया गया है - http://nathanborror.com/posts/2008/aug/11/creating-basic-api-django/ हो सकता है कि आप "एपीआई फ्रेमवर्क" जैसे कि डीजेंगो-टेस्टपीपी का उपयोग करना चाहें। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^