2011-08-31 20 views
11

मैं एक अजगर अनुप्रयोग से निपट रहा हूं जिसमें कई वितरित हल्के घटकों को शामिल किया गया है जो RabbitMQ & Kombu का उपयोग करके संवाद करते हैं।फ्लास्क के साथ कक्षा में आरईएसटी व्यवहार जोड़ना, ब्लूप्रिंट के मामले?

एक घटक दो कतारों पर सुनता है और प्रत्येक कतार पर एकाधिक संदेश प्रकार प्राप्त कर सकता है। Subclasses कस्टम हैंडलर पंजीकृत करके प्रत्येक संदेश प्रकार को संसाधित करने के तरीके को ओवरराइड कर सकते हैं। यह सब ठीक काम करता है।

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

इसे हल्के वजन की आवश्यकता है, इसलिए कुछ शोध के बाद मैं फ्लास्क पर बस गया हूं (लेकिन सुझावों के लिए खुला हूं)। स्यूडोकोड में इसका मतलब है ले:

class Component: 
    Queue A 
    Queue B 
    ... 
    def setup(..): 
    # connect to the broker & other initialization 

    def start(..): 
    # start the event loop and wait for work 

    def handle_msg_on_A(self,msg): 
    # dispatch a msg to a handler depending on the msg type 

    def handle_msg_on_B(self,msg): 
    ... 

    ... 

और देखने के तरीकों की संख्या को जोड़ते:

@app.route('/') 
    def web_ui(self): 
     # render to a template 

    @app.route('/state') 
    def get_state(self): 
     # REST method to return some internal state info as JSON 

    ... 

हालांकि, इस तरह एक वर्ग पर एक वेब UI bolting SOLID सिद्धांतों टूट जाता है और (एक उपवर्ग विरासत के साथ समस्याओं को लाता है अधिक/कम जानकारी प्रदर्शित करना चाह सकते हैं)। सजावटी विरासत में नहीं हैं इसलिए प्रत्येक दृश्य विधि को स्पष्ट रूप से ओवरराइड और पुनर्वितरण की आवश्यकता होगी। शायद एक मिश्रण + प्रतिबिंब का उपयोग किसी भी तरह से काम कर सकता है लेकिन यह हैकिश लगता है।

इसके बजाए, रचना का उपयोग कर काम कर सकता है: वेब सामान को एक अलग वर्ग में रखें जो यूआरएल मार्गों को नेस्टेड घटक पर पॉलीमोर्फिक तरीकों के एक निश्चित, पूर्वनिर्धारित सेट पर प्रतिनिधि करता है। इस तरह के घटक लचीलेपन में कुछ नुकसान की लागत पर फ्लास्क से अनजान रहते हैं (उपलब्ध विधियों का सेट तय किया गया है)।

अब मैंने Flask blueprints और Application Dispatching खोजा है और ऐसा लगता है कि वे एक बेहतर, अधिक एक्स्टेंसिबल समाधान ला सकते हैं। हालांकि, मैंने अभी तक अपने सिर को लपेटना नहीं है।

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

उत्तर

11

फ्लास्क 0.7 में कुछ और चुपचाप पेश किया गया था जो आपके लिए ब्याज हो सकता है - Pluggable Views। ये वर्ग आधारित फ़ंक्शन आधारित एंडपॉइंट्स के बजाए हैं - ताकि आप अपने राज्य संक्रमणों को प्रबंधित करने के लिए dispatch_request विधि का उपयोग कर सकें (केवल आवश्यकता होने पर इसे ओवरराइड कर सकते हैं)।

एप्लिकेशन डिस्पैचिंग का उपयोग करने के विपरीत इस तरह से करने का लाभ यह है कि आपको अपने पूरे एप्लिकेशन में url_for समर्थन मिलता है (जैसा कि आवेदन सीमाओं को पार करने वाले यूआरएल में हार्ड कोड होने के विपरीत)। आपको करना होगा तय करें कि यह ऐसा कुछ है जो आपके आवेदन के लिए एक मुद्दा होने की संभावना है।

छद्म कोड में:

# File: Components.py 
from flask.views import View 

class Component(View): 
    # Define your Component-specific application logic here 

    dispatch_request(self, *url_args, **url_kwargs): 
     # Define route-specific logic that all Components should have here. 
     # Call Component-specific methods as necessary 

class Tool_1(Component): 
    pass 

class Tool_2(Component): 
    # Override methods here 

# File: app.py 
from flask import Flask 
from yourapplication import Tool_1, Tool_2 

app = Flask() 

# Assuming you want to pass all additional parameters as one argument 
app.add_url_rule("/tool_1/<path:options>", "tool1", view_func=Tool_1.as_view()) 

# Assuming you want to pass additional parameters separately 
tool_2_view = Tool_2.as_view() 
app.add_url_rule("/tool_2/", "tool2", view_func=tool_2_view) 
app.add_url_rule("/tool_2/<option>", "tool2", view_func=tool_2_view) 
app.add_url_rule("/tool_2/<option>/<filter>", "tool2", view_func=tool_2_view) 

आप मिश्रण करने के लिए ब्लूप्रिंट जोड़ सकते हैं यदि आप घटक है कि सभी तार्किक एक साथ जुड़े हुए हैं की एक श्रृंखला है और आप नहीं चाहते /prefix को प्रत्येक के add_url_rule कॉल के सामने रखना याद रखना होगा। लेकिन अगर आपके पास केवल हैं जो एक दूसरे से स्वतंत्र हैं, तो यह पैटर्न है जिसका मैं उपयोग करूंगा *।

*। दूसरी तरफ, यदि उन्हें अलग-अलग एक दूसरे से अलग करने की आवश्यकता है, तो मैं दस्तावेज़ों में अनुशंसित अनुप्रयोग डिस्पैच पैटर्न का उपयोग करूंगा।

+0

कूल, उत्तर के लिए धन्यवाद, निश्चित रूप से इसमें देखेंगे और जवाब देगा अगर यह – dgorissen

+0

पर काम करता है क्या यह @dgorissen काम करता है –