2012-06-22 18 views
24

मैं एक साधारण रहा हूँ (यानी, नहीं एक है कि एक संदेश कतार को संभालने के लिए एक अलग सर्वर सेटअप करने के लिए मुझे आवश्यकता है) के लिए लंबे समय से मतदान करने के लिए जिस तरह से एक छोटा वेब-इंटरफ़ेस जो गणना चलाता है और एक ग्राफ उत्पन्न करता है। यह मेरा वेब इंटरफेस क्या करने की जरूरत है:गैर संदेश कतार अजगर (और बोतल) में/सरल लंबी मतदान

  1. उपयोगकर्ता एक वेब-इंटरफेस
  2. सर्वर कुछ गणना चलाता है में एक ग्राफ/डेटा अनुरोध करता है।
  3. सर्वर गणना चल रहा हो, एक छोटा सा कंटेनर गणना प्रगति (आप प्रिंट (यानी प्रिंट के साथ एक consol में क्या चाहते हैं क्या करने के लिए इसी के साथ अद्यतन किया जाता है (AJAX/jQuery के माध्यम से होने की संभावना) 'घनत्व समारोह की गणना ...'))
  4. गणना खत्म और ग्राफ उपयोगकर्ता के लिए दिखाया गया है।

गणना के रूप में सभी सर्वर-साइड किए गए हैं, मुझे सच में यह सुनिश्चित नहीं है कि इसे आसानी से कैसे सेट किया जाए। जाहिर है, मैं मतदान को संभालने के लिए एक आरईएसटी एपीआई स्थापित करना चाहता हूं, जो फ्लास्क में आसान होगा। हालांकि, मुझे यकीन नहीं है कि वास्तविक अपडेट कैसे प्राप्त करें। एक स्पष्ट, यद्यपि इस उद्देश्य के लिए जटिल, समाधान एक मैसेजिंग कतार स्थापित करना होगा और कुछ लंबे मतदान करना होगा। हालांकि, मुझे यकीन नहीं है कि यह इस सरल के लिए सही दृष्टिकोण है।

यहाँ मेरी प्रश्न हैं:

  1. वहाँ फ़ाइल सिस्टम का उपयोग यह करने के लिए कोई तरीका है? प्रदर्शन एक बड़ा मुद्दा नहीं है। AJAX/jQuery एक फ़ाइल से संदेश मिल सकता है? प्रगति को कुछ .json फ़ाइल में सहेजें?
  2. पिकलिंग के बारे में क्या? (मुझे वास्तव में पिकलिंग के बारे में बहुत कुछ पता नहीं है, लेकिन हो सकता है कि मैं एक संदेश निर्देश उठा सकूं और इसे एक एपीआई द्वारा पढ़ा जा सके जो मतदान को संभालने वाला है)।
  3. मतदान भी सही दृष्टिकोण है? क्या इसे संभालने के लिए कोई बेहतर या अधिक आम पैटर्न है?

मुझे एहसास है कि मैं चीजों को कम कर रहा हूं क्योंकि मुझे पता है कि इस तरह की चीज वेब पर आम है। अक्सर मुझे लगता है कि कुछ घटित हो रहा है और कुछ "loading.gif" छवि चल रही है जबकि कुछ गणना चल रही है (उदाहरण के लिए, Google Analytics में)।

आपकी मदद के लिए धन्यवाद!

उत्तर

39

मैंने फ्लास्क और jQuery का उपयोग करके इस तरह के कई ऐप्स बनाए हैं। उस अनुभव के आधार पर, मैं कहूंगा कि आपकी योजना अच्छी है।

  1. फाइल सिस्टम का उपयोग न करें। आप जावास्क्रिप्ट सुरक्षा मुद्दों/सुरक्षा में भाग लेंगे। संभावित घटना में आपको उचित कामकाज मिलते हैं, फिर भी आपके पास पोर्टेबल या स्केलेबल कुछ भी नहीं होगा। इसके बजाए, फ्लास्क जैसे छोटे स्थानीय वेब सेवारत ढांचे का उपयोग करें।

  2. अचार मत करो। JSON का प्रयोग करें। यह वेब ऐप्स और आरईएसटी इंटरफेस की भाषा है। jQuery और चार्ट, ग्राफ और ड्राइंग के लिए उन अच्छे jQuery- आधारित प्लगइन्स JSON की अपेक्षा करेंगे। इसका उपयोग करना आसान है, मानव-पठनीय, और छोटे पैमाने पर ऐप्स के लिए, किसी और स्थान पर जाने का कोई कारण नहीं है।

  3. लंबी मतदान आप क्या हासिल करना चाहते हैं के लिए ठीक है। शुद्ध HTTP- आधारित ऐप्स में कुछ सीमाएं हैं। और वेबसाकेट्स और सॉकेट.आईओ जैसी समान सॉकेट-आईश परतें "भविष्य हैं।" लेकिन सर्वर-साइड कार्यान्वयन के अच्छे, सरल उदाहरणों को ढूंढना मेरे अनुभव में मुश्किल हो गया है।मैंने कड़ी मेहनत की है। ऐसे कई उदाहरण हैं जो आपको नोड.जेएस, रेडिस और मिडलवेयर के अन्य टुकड़ों को स्थापित करना चाहते हैं। लेकिन हमें दो या तीन अलग मिडलवेयर सर्वर क्यों स्थापित करना चाहिए? यह हास्यास्पद है। इसलिए फ्लास्क जैसे सरल, शुद्ध-पायथन वेब ढांचे पर लंबे समय तक मतदान आईएमओ जाने का तरीका है।

कोड एक छोटे से एक टुकड़ा की तुलना में अधिक है, इसलिए बजाय इसे यहाँ सहित, मैं एक सरल उदाहरण a Mercurial repository on bitbucket में आप स्वतंत्र रूप से समीक्षा कर सकते हैं कि प्रति, या क्लोन रख दिया है, है। वहाँ तीन हिस्से होते हैं:

  • serve.py एक अजगर/बोतल आधारित सर्वर
  • templates/index.html 98% एचटीएमएल, 2% टेम्पलेट बोतल आधारित सर्वर फ़ाइल HTML के रूप में प्रस्तुत करना होगा
  • static/lpoll.js एक jQuery आधारित ग्राहक
+2

आह, धन्यवाद * इसके लिए * बहुत कुछ! मैं आज रात आपके कोड पर एक नज़र डालने जा रहा हूँ। "लेकिन सर्वर-साइड कार्यान्वयन के अच्छे, सरल उदाहरणों को ढूंढना मेरे अनुभव में मुश्किल था।" मेरे पास सटीक अनुभव है, इसलिए मुझे यह सुनकर खुशी हुई कि मैं अकेला नहीं हूं। एक बार फिर धन्यवाद!! – aaronlevin

+0

FYI मैंने पहली बार बोतल.py (एक लंबी उपप्रोसेस्क्रिप्ट स्क्रिप्ट के साथ) की कोशिश की और कुछ अवरोधन समस्याएं आईं। फ्लास्क के साथ यह बहुत अच्छा काम करता है। धन्यवाद! – Nate

+0

एक से अधिक ग्राहकों को सिंक्रनाइज़ करने के लिए सभी एक ही समय में सिग्नल प्राप्त करेंगे? – r1d3h4rd

10

लंबे समय से मतदान एक उचित काम था-सरल से पहले, वेब सॉकेट के लिए प्राकृतिक समर्थन अधिकांश ब्राउज़र में आया था, और इससे पहले कि इसे आसानी से फ्लास्क ऐप्स के साथ एकीकृत किया गया था। लेकिन यहां 2013 के मध्य में, वेब सॉकेट समर्थन एक लंबा सफर तय किया गया है।

Here is an example, ऊपर दिए गए जैसा ही है, लेकिन फ्लास्क और वेब सॉकेट को एकीकृत करता है। यह gevent और gevent-websocket से सर्वर घटकों के ऊपर चलता है।

नोट करें कि यह उदाहरण वेब सॉकेट कृति होने का इरादा नहीं है। यह अधिक आसानी से तुलनीय बनाने के लिए lpoll संरचना में से कई को बरकरार रखता है। लेकिन यह तुरंत प्रतिक्रिया, सर्वर ओवरहेड, और वेब ऐप की अंतःक्रियाशीलता में सुधार करता है।

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