2010-07-20 13 views
7

यह मेरा पहला प्रश्न है, इसलिए मुझे आशा है कि यह सही तरीके से किया जाएगा;)एक पायथन कमांड लाइन स्क्रिप्ट वेब-ifing?

मुझे कुछ "घर निर्मित" पायथन लिपि में एक वेब इंटरफ़ेस देने का कार्य सौंपा गया है। इस स्क्रिप्ट का उपयोग कर्ल कमांड के माध्यम से कुछ वेब साइट्स/एप्लिकेशन उपलब्धता की जांच के लिए किया जाता है। इस स्क्रिप्ट का एक बहुत ही महत्वपूर्ण पहलू यह है कि यह वास्तविक परिणाम में लाइन के आधार पर वास्तविक समय में लाइन को लिखता है।

इस स्क्रिप्ट को वेब इंटरफ़ेस देकर, मुख्य लक्ष्य यह है कि स्क्रिप्ट आसानी से कहीं से भी उपयोग की जा सकती है, उदाहरण के लिए स्मार्टफ़ोन के माध्यम से। तो वेब इंटरफेस काफी बुनियादी होना चाहिए, और "प्लगइन मुक्त" काम करना चाहिए।

मेरी समस्या यह है कि वेब पर मुझे लगता है या पाया गया अधिकांश समाधान (AJAX, django, यहां तक ​​कि एक साधारण पोस्ट) को ब्राउज़र पर भेजने से पहले पृष्ठ की पूरी पीढ़ी की आवश्यकता होती है, इस महत्वपूर्ण "वास्तविक- समय "पहलू।

यह ठीक से कैसे करें इस पर कोई विचार है?

अग्रिम धन्यवाद।

+0

धन्यवाद, मैं वर्तमान में अन्य कार्यों पर व्यस्त हूँ, लेकिन मैं इस पर वापस जाना चाहिए जल्द ही ;-) – Lenn

उत्तर

0

आपका काम दिलचस्प लगता है। :-) एक परिदृश्य जो अभी दिमाग में आया है: आप निरंतर संसाधनों को अपने घर-ब्रू स्क्रिप्ट के साथ स्क्रैप करते हैं, और परिणामों को अपने लगातार डेटाबेस और कैशिंग सिस्टम में दबाते हैं - जैसे रेडिस - एक साथ। क्लाइंट अनुरोधों की सेवा करते समय आपकी कैशिंग प्रणाली/परत प्राथमिक डेटा स्रोत के रूप में कार्य करती है। रेडिस एफए एक उच्च-प्रदर्शन कुंजी-मूल्य-स्टोर है जो प्रति सेकेंड 100k कनेक्शन को संभालने में सक्षम है। हालांकि केवल नवीनतम (एफए 50k प्रविष्टियों का कहना है) का मतलब है कि कैशिंग सिस्टम केवल इन प्रविष्टियों को पकड़ लेगा और आपको सर्वर-साइड एपीआई (कनेक्शन को संभालने, प्रोसेसिंग अनुरोध, रेडिस से पढ़ने) और फ्रंटएंड को विकसित करने पर पूरी तरह केंद्रित होगा। फ्रंटएंड और बैकएंड-एपीआई के बीच संचार वेबसॉकेट कनेक्शन द्वारा संचालित किया जा सकता है। एचटीएमएल 5 spec का एक सुंदर नया हिस्सा। हालांकि, हालांकि, इन दिनों जारी किए गए कई ब्राउज़र संस्करणों द्वारा पहले ही समर्थित है। वैकल्पिक रूप से आप कुछ एसिंक्रोनस फ्लैश सॉकेट-सामान पर फ़ॉलबैक कर सकते हैं। Websockets मूल रूप से एक ग्राहक और एक सर्वर के बीच लगातार कनेक्शन के लिए अनुमति देते हैं; आप इवेंट श्रोता को पंजीकृत कर सकते हैं जिसे प्रत्येक आने वाले डेटा/-पैकेट के लिए बुलाया जाता है - कोई अंतहीन मतदान या अन्य सामान नहीं।

3

एक समाधान के लिए एक संक्षिप्त वर्णन:

जो अपने वेब पेज के लिए लेआउट शामिल एक HTML फ़ाइल बनाएँ, स्क्रिप्ट का आउटपुट के लिए एक समर्पित DIV के साथ:

<html> 
<body> 
<div id="scriptoutput"></div> 
<script type="text/javascript" src="localhost:8000/runscript"/> 
</body> 
</html> 

यह HTML फ़ाइल हो सकता है आप चाहते हैं कि किसी भी सर्वर का उपयोग कर सेवा की।

import os 
f = os.popen('ping 127.0.0.1') 
for i in range(30): 
    ln = f.readline() 
    print "document.getElementById('scriptoutput').innerHTML += '<pre>%s</pre><br/>';" % ln 

आप कार्य, या अगर किसी भी सीजीआई/WSGI सर्वर का उपयोग कर सकते हैं:

अब, जो स्क्रिप्ट चलाता है और (अजगर में उदाहरण) एक javascript आदेश को प्रत्येक पंक्ति में कनवर्ट करता है एक सरल http सर्वर बारे में प्रदर्शन महत्वपूर्ण नहीं है, यहां तक ​​कि पायथन की BaseHTTPServer कक्षा का भी उपयोग करें।

यह चाल चलती है, क्योंकि अधिकांश ब्राउज़र्स पार्स करते हैं और जावास्क्रिप्ट स्क्रिप्ट को निष्पादित करते हैं (और न केवल अनुरोध पूरा होने पर) - ध्यान दें कि कोई भी मतदान या सर्वर-साइड स्टोरेज की आवश्यकता नहीं है!

+0

मैं साबित कर दिया python2.7 server.py स्क्रिप्ट चल रहा है और पैरामीटर के बिना स्क्रिप्ट निर्देशिका और index.html के रूप में एचटीएमएल कोड की सेवा के लिए संशोधित। मैं अजगर कोड चलाने के लिए और त्रुटि मिली:,: "/test/javascr.py डी ', लाइन 4 ln = f.readline() AttributeError में: फ़ाइल' टपल 'ऑब्जेक्ट कोई गुण नहीं है' ReadLine ' और ब्राउज़र ने खाली पृष्ठ दिखाया। कुछ याद आना चाहिए। उदाहरण के लिए पाइथन स्क्रिप्ट नाम को कहां रखा जाए, सरल प्रिंट "हैलो वर्ल्ड" कहें? –

+0

क्षमा करें, यह popen2 - निश्चित के बजाय popen किया जाना चाहिए था। – adamk

0

मुझे आशा है कि मैं आपकी ज़रूरत को सही तरीके से समझूंगा।

अजाक्स के पीछे विचार पूरे पृष्ठ को पुनः लोड किए बिना पृष्ठ की सामग्री को अपडेट करना है। मुझे लगता है कि यह आपकी जरूरत के अनुरूप होना चाहिए। यदि आप उन्हें वेब बनाना चाहते हैं तो आपको अपने आदेशों को संशोधित करना पड़ सकता है।आपको "फ्लाई पर" प्रिंट प्रिंट प्राप्त करने की आवश्यकता हो सकती है।

यहां कुछ सुझाव दिए गए हैं:

  1. संभावना आदेश पर अमल करने के लिए के साथ एक बहुत ही सरल पेज लिखें (मेनू, प्रपत्र ...)

  2. उपयोगकर्ता एक आदेश के निष्पादन के लिए पूछना है, भेज सर्वर को एक AJAX क्वेरी जो आदेश निष्पादित करता है।

  3. sys.stdout को किसी डेटाबेस में प्रिंट लॉग संग्रहीत करने के लिए पुनर्निर्देशित करने के लिए आपके आदेशों को संशोधित करने की आवश्यकता है। आप sys.stdout को write फ़ंक्शन वाले ऑब्जेक्ट को असाइन करके इसे कर सकते हैं।

    class MyDbLogger: 
        def __init__(self, ...): 
         """Some initialization""" 
         ... 
    
        def write(self, s): 
         """write into the database""" 
         ... 
    
    dbout = MyDbLogger(...) 
    sys.stdout = dbout 
    
  4. ग्राहक regurlarly सर्वर पोल डेटाबेस में सामग्री प्राप्त है और फिर इसे पेज में लिखने के लिए होगा।

  5. धूमकेतु निश्चित रूप से वास्तविक समय व्यवहार करने के लिए जांच करने की तकनीक है। यह नियमित आधार पर सर्वर को मतदान करने के लिए ग्राहक से बच जाएगा। यह # 4 में सुधार हो सकता है लेकिन इसे लागू करने के लिए थोड़ा और मुश्किल हो सकता है।

मुझे आशा है कि यह मदद करता है अपने जवाब के लिए

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