2013-11-22 21 views
6

का प्रयास करते समय नई CORS कुप्पी के शोकहारा पर सुविधा, मुझे पता चला है कि डेकोरेटर केवल समारोह एक स्ट्रिंग लौटाता है यदि लागू किया जा सकता।लेखन त्रुटि कुप्पी के शोकहारा

उदाहरण के लिए, संशोधित करने Quickstart example:

class HelloWorld(restful.Resource): 
    @cors.crossdomain(origin='*') 
    def get(self): 
     return {'hello': 'world'} 

फेंकता:

TypeError: 'dict' object is not callable

मैं कुछ गलत कर रहा हूं?

उत्तर

4

मैं हाल ही में अपने आप को इस मुद्दे बारे में जाना। @MartijnPieters सही है, decorators दृश्य के एकल तरीकों पर नहीं बुलाया जा सकता है।

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

class AbstractAPI(): 
     decorators = [cors.crossdomain(origin='*')] 

    class HelloWorld(restful.Resource, AbstractAPI): 
     #content 

नहीं।

केवल आपके एपीआई उदाहरण

api = Api(app) 
api.decorators=[cors.crossdomain(origin='*')] 
+0

यह काम करता है, धन्यवाद! – user3022063

+0

इसके अलावा, flask_restful.utils आयात cors ' – JeffD23

0

लिपटे समारोह की वापसी मान flask.make_response() (एक तर्क के रूप में) पारित हो जाता है; कुछ भी है कि एक सामान्य बोतल दृश्य लौट सकते हैं स्वीकार्य है। सजावटी अनिवार्य रूप से this Flask snippet जैसा ही है। आपको चाहिए वास्तव में सीधे तरीकों यहाँ पर नहीं डाल सज्जाकार

क्योंकि कुप्पी के शोकहारा Resourceflask.views.MethodView का एक उपवर्ग है। के रूप में Decorating Views में दस्तावेज आप एक विशेष वर्ग विशेषता, decorators जो सूची दी गई है में दृश्य सज्जाकार में सूचीबद्ध करना चाहिए:

class HelloWorld(restful.Resource): 
    decorators = [cors.crossdomain(origin='*')] 

    def get(self): 
     return {'hello': 'world'} 

और बोतल जो क्या बोतल वास्तव में जब कहता है HelloWorld.as_view() द्वारा लौटाए गए वास्तविक दृश्य विधि, को देखने के लिए लागू होगी दृश्य के लिए मार्ग प्रेषण।

उन्हें तरीकों को सीधे लागू करना ही सर्वर के रूप में यह, JSON करने के लिए अजगर datastructures एन्कोडिंग के लिए उपयुक्त वापस जाने के लिए जो क्या cors.crossdomain() रिटर्न वैसे भी नहीं है तरीकों की उम्मीद है restful.Resource डिस्पैचर भ्रमित करने के लिए होगा।

+3

'सजावट 'वर्ग चर का उपयोग करके मुझे अभी भी एक ही त्रुटि मिलती है ... – user3022063

+0

@ user3022063: वास्तव में? यह बहुत उत्सुक है, क्योंकि 'HelloWorld.as_view()' को तब तक लागू नहीं किया जाता है, जिसका अर्थ है कि उन्हें 'get()' पर नहीं बल्कि प्रेषक को लागू किया जाता है, इसलिए ** ** ** आराम के बाद। संसाधन 'JSON में आपकी विधि प्रतिक्रिया बदल दी है। –

+0

दरअसल, ऐसा नहीं होता है, शायद इसलिए कि फ्लास्क-रेस्टफुल संसाधन संसाधनों को देखने योग्य नहीं हैं, लेकिन कुछ अलग है। – miracle2k

0

मैंने पाया कि आप अभी भी आप एक स्ट्रिंग या JSON प्रतिक्रिया (जो एक के लिए शायद अच्छा अभ्यास है वापसी प्रदान की डेकोरेटर का उपयोग कर सकते बनाने के बाद मापदंडों के डेकोरेटर सूची में जोड़ने के वैसे भी एपीआई)। यह महत्वपूर्ण है यदि आप मार्ग-विशिष्ट सीओआरएस हेडर करना चाहते हैं, सजावट का उपयोग करके जीवन को और अधिक आसान बनाता है। अधिक जानकारी के लिए इस विलय कर दिया पुल अनुरोध देखें: https://github.com/flask-restful/flask-restful/pull/131

यहाँ एक उदाहरण है:

from . import app 
from flask_restful import reqparse, abort, Api, Resource 
from flask.ext.cors import cross_origin 
from datetime import datetime 
from flask import jsonify 

api = Api(app) 


class DateTime(Resource): 
    @cross_origin(origins="http://localhost:63342*") 
    def get(self): 
     return jsonify({'DateTime': str(datetime.today())}) 

api_root = '/api/v1/' 
api.add_resource(DateTime, api_root + 'DateTime') 

आप कुप्पी के सुरक्षा का उपयोग कर रहे हैं, तो प्रमाणन सज्जाकार जोड़ने मेरी परीक्षण में कुछ अजीब व्यवहार किया था। मैं इसके बजाय assert current_user.is_authenticated की अनुशंसा करता हूं। यदि आप प्रमाण-पत्र की अनुमति दे रहे हैं, तो सुनिश्चित करें कि सीएसआरएफ की सुरक्षा हो।

+0

से जोड़ें' फ्लास्क-रेस्टफुल का उपयोग करने का पूरा * बिंदु * आपके एपीआई * प्रतिक्रिया एन्कोडिंग अज्ञेयवादी * बनाना है। फ्लास्क-क्लाइंट के साथ सामग्री बातचीत के आधार पर एक्सएमएल, जेएसओएन, या कुछ भी जो आप इसे सिखाते हैं, एक स्वीकृत प्रतिक्रिया एन्कोडिंग को एन्कोड करने की ज़िम्मेदारी लेती है। –

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