2016-12-22 29 views
6

रूप में परिभाषित किया (हालांकि इस सवाल बोतल के बारे में विशेष रूप से है, यह शीर्षक के अनुसार सामान्यीकृत किया जा सकता)एक डेकोरेटर समारोह एक उदाहरण चर

मैं एक वर्ग के अंदर बोतल के app.route() डेकोरेटर का उपयोग करने के कोशिश कर रहा हूँ का उपयोग करना। हालांकि, फ्लास्क ऐप को इंस्टेंस वैरिएबल के रूप में प्रारंभ किया गया है, यानी self.server ऐप पर सेट है। इसका मतलब है कि मैं सजावटी का उपयोग नहीं कर सकता, क्योंकि self सजाए गए विधि के बाहर अपरिभाषित है। मैं निम्नलिखित करने में सक्षम होना चाहता हूं:

class MyClass: 

    def __init__(self): 
     self.server = Flask(__name__) 

    @self.server.route('/') 
    def home(): 
     return '<h1>Success</h1>' 

क्या इस मुद्दे के लिए कोई कार्य-आसपास है? कोई भी मदद बहुत ही सराहनीय होगी!

उत्तर

2

आप __init__ विधि के संदर्भ में फ़ंक्शन को परिभाषित कर सकते हैं। फिर, फ़ंक्शन को सामान्य रूप से कॉल करने में सक्षम बनाने के लिए, home सदस्य के बराबर सेट करें।

class MyClass: 
    def __init__(self): 
     self.server = Flask(__name__) 

     # This is indented at __init__'s level, so a new instance of the function 
     # is defined every time __init__ runs. That means a new instance 
     # is defined for each instance of the class, and so it can be wrapped with 
     # the instance's "self" value. 
     @self.server.route('/') 
     def home_func(): 
      return '<h1>Success</h1>' 

     # Then, you make it an object member manually: 
     self.home = home_func 
+0

धन्यवाद! यह पूरी तरह से काम करता है –

+1

मैं दलील दूंगा कि यह एक आगे दिखने वाला समाधान नहीं है, क्योंकि आप अंततः एक विशाल '__init __()' विधि के साथ हवादार हो जाएंगे जिसमें आपकी सभी रूट परिभाषाएं और उनकी संबंधित कार्यक्षमता शामिल है। ['Add_url_rule()' function] (http://flask.pocoo.org/docs/0.12/api/#flask.Flask.add_url_rule) का उपयोग करने के लिए बेहतर है, जैसा कि मेरे अपने (और @rumdrums ') में बताया गया है यह प्रश्न। – YellowShark

+1

फ्लास्क के मामले में, यह शायद बेहतर है। हालांकि, यह उन लोगों के लिए भी एक अच्छा सवाल है जो फ्लास्क का उपयोग नहीं कर रहे हैं। इसके अतिरिक्त, इस तरह से परिभाषित कार्यों में 'add_url_rule' की तुलना में प्रति कार्य केवल एक और पंक्ति होती है, इसलिए मुझे नहीं लगता कि" एक विशाल '__init __() 'विधि" विशेष रूप से महत्वपूर्ण है। – IanPudney

2

मुझे यकीन है कि क्या आपके समग्र उपयोग मामला है नहीं कर रहा हूँ, लेकिन आप बेहतर एक कक्षा में एप्लिकेशन वस्तु को एम्बेड नहीं है और इसके बजाय बोतल के Pluggable Views मॉड्यूल का उपयोग करके कार्य किया जा सकता है। यह आपको flask.views.View से प्राप्त कक्षाओं के रूप में अपने विचारों को स्पष्ट रूप से परिभाषित करने की अनुमति देगा। उदाहरण:

import flask 
import flask.views 

class MyClass(flask.views.View): 
    def dispatch_request(self): 
    return '<h1>Success</h1>' 

app.add_url_rule('/test', view_func=MyClass.as_view('home')) 

यह निश्चित रूप से अधिक छोटा सा उदाहरण दिया कोड है, लेकिन यह आप के बजाय अपने स्वयं के मार्गों के साथ अन्य वर्गों या कार्यों को परिभाषित करने के लिए, और संभवतः विचार करने के लिए MethodViews और अधिक लचीलापन है, जो परिभाषित करने के लिए एक अच्छा संरचना प्रदान करते हैं देता है एकाधिक HTTP विधियों और उन्हें एक वर्ग के साथ जोड़ना। route() डेकोरेटर का उपयोग करने का

3

इसके बजाय, आप तो जैसे self.server वस्तु की add_url_rule method का उपयोग करना चाहिए,:

class MyClass: 
    def __init__(self): 
     self.server = Flask(__name__) 
     self.server.add_url_rule('/', 'home', self.home) 
     self.server.add_url_rule('/route-1', 'route-1', self.route_1) 
     self.server.add_url_rule('/route-2', 'route-2', self.route_2) 

    def home(): 
     return '<h1>Success</h1>' 

    def route_1(): 
     ... 

    def route_2(): 
     ... 

यह पैटर्न आप वर्ग पर तरीकों के रूप में अपने मार्ग संचालकों को परिभाषित करने की अनुमति देता है और भी बहुत आसान है पढ़ें, क्योंकि आप एक ब्लॉक में अपने सभी यूआरएल नियम देख सकते हैं।

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