2011-05-26 6 views
7

मुझे रूटिंग होने से पहले फ्लास्क अनुरोध ऑब्जेक्ट को संशोधित करने का प्रयास करने में कठिनाई हो रही है।मैं फ्लास्क मॉड्यूल में PUT और DELETE के लिए HTTP विधियों को ओवरराइड कैसे कर सकता हूं?

मेरा एपीआई मॉड्यूल (मेरा पूरा फ्लास्क ऐप नहीं) एक विशेष शीर्षलेख भेजकर PUT को पकड़ने और संचालन को हटाने पर निर्भर करता है। मुझे "-Method" शीर्षलेख की सामग्री को जांचने और फ्लास्क अनुरोध ऑब्जेक्ट को तदनुसार संशोधित करने से पहले फ्लास्क अनुरोध ऑब्जेक्ट को संशोधित करने की आवश्यकता है।

इस छोटे, pythonic, स्पष्ट कोड मैं चाहूँगा काम है करने के लिए:

@api.before_request 
def method_scrubbing(): 
    if request.headers.has_key('-Method'): 
     method = request.headers['-Method'].upper() 
     tagalog.log("in before_request, -Method = {}".format(method), 'force') 
     if method not in ['PUT', 'DELETE']: 
      raise ApiMethodException(method) 
     else: 
      request.method = method 

... लेकिन मैं WERKZEUG से एक "केवल संपत्ति पढ़ें" त्रुटि मिलती है: http://drktd.com/74yk

मैं http://flask.pocoo.org/snippets/38/ पर आर्मीन की पोस्ट प्रतीत होती है लेकिन यह ऐप-व्यापी (मॉड्यूल के लिए विशिष्ट नहीं) प्रतीत होता है।

उत्तर

6

वेर्कज़ुग का मानना ​​है कि अनुरोध केवल डब्लूएसजीआई मिडलवेयर में संशोधित किया गया है या इससे पहले कि वेर्कजेग के पास डेटा तक पहुंच है। इसका कारण यह है कि इस तरह Werkzeug को डब्ल्यूएसजीआई पर्यावरण की निगरानी करने की आवश्यकता नहीं है यह देखने के लिए कि क्या इसे कैश को अमान्य करना होगा या व्यवहार बदलना होगा।

इस विशेष मामले में आप फिर भी सफल हो सकता है अगर आप अंतर्निहित WSGI पर्यावरण को संशोधित करके ध्यान से कर रहे हैं:

request.environ['REQUEST_METHOD'] = 'something' 

कि request.method के बाद "कुछ" दिखाना चाहिए और व्यवहार पार्स के रूप में बदलना चाहिए। मैंने यह कोशिश नहीं की है और यह नहीं पता कि यह काम करेगा या नहीं। व्यक्तिगत रूप से मैं एक मिडलवेयर लिखूंगा जो पूरे एप्लिकेशन के लिए पुनर्लेखन करता है या शायद उस व्यवहार के लिए कुछ सरल यूआरएल उपसर्ग मिलान करता है।

+0

काफी काम नहीं करता है। यदि मैंने ऐसा कहा है, और जैसा कि आपने कहा है, 'request.environ [' REQUEST_METHOD ']' ''' '' 'पर सेट करें,' request.method' वास्तव में मूल्य को तुरंत '' PUT'' 'के रूप में दिखाता है। हालांकि, अनुरोध अभी भी वहां जाता है जहां यह वैसे भी चला जाएगा (इस मामले में, '@ api.route ('/ isoSpace//टाइल/', विधियों = ['पोस्ट'] से सजाए गए मार्ग पर) ')। उस फ़ंक्शन के भीतर, 'request.method' फिर से' POST 'जैसा दिखता है। –

+0

मिडलवेयर केवल एक मॉड्यूल पर लागू करने का कोई तरीका है? –

+0

डब्ल्यूएसजीआई परत पर मध्यवर्ती काम नहीं कर रहे हैं। हालांकि आप मिडलवेयर को कुछ बुनियादी पथ जांच करने दे सकते हैं। –

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