2013-11-22 13 views
6

フラスコの上で新しいCORS機能を試している間、私はデコレータが文字列を返す場合にのみデコレータを適用できることを発見しました。例えばフラスコで快適なタイプの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ビューの単一のメソッドで呼び出すことはできません。

私はリストを含む抽象基本クラスを作成しました。 Resource(flask-restfulから)を消費するクラスは、実際にデコレータリストをビューに適用するクラスである基本クラスも継承します。

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

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

いいえ。

あなたはAPIインスタンス

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

これは、ありがとう! – user3022063

+0

また、 'flask_restful.utils import cors'を追加してください。 – JeffD23

0

ラップされた関数の戻り値は、1つの引数として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()によって返された実際の表示方法にビューを適用しますビューへのルートのディスパッチ。

メソッドに直接適用すると、restful.Resourceディスパッチャーは、cors.crossdomain()が返してくるものではなく、JSONにエンコードするのに適したPythonデータ構造を返すメソッドを期待しているので、混乱するだけです。

+3

'decorators'クラスの変数を使用すると、私はまだ同じエラーが発生します... – user3022063

+0

@ user3022063:本当ですか?これは 'HelloWorld.as_view()'が呼び出されるまで適用されないので、 'get()'ではなくディスパッチャーに適用されるので**興味深いです** ** restful.Resource 'メソッドレスポンスをJSONに変換しました。 –

+0

実際、フラスコで安らかなリソースはプラグイン可能なビューではありませんが、何か異なる可能性があります。 – miracle2k

0

を作成した後、私はあなたがまだあなたは、おそらくのために良い方法です文字列またはJSONレスポンスを(返す提供デコレータを使用することができることを発見したパラメータにデコレータのリストを追加APIとにかく)。これは、ルート固有のCORSヘッダーを作成する場合に重要です。デコレータを使用すると、作業がはるかに簡単になります。詳細については、このマージプルREQを参照してください: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をお勧めします。資格情報を許可している場合は、CSRFが保護されていることを確認してください。

+0

Flask-Restfulを使用することのポイント*は、あなたのAPIをレスポンスエンコーディングにすることです。 Flask-Restfulは、クライアントとのコンテンツネゴシエーションに基づいて、XML、JSONなどの受け入れられた応答エンコーディングにエンコードする責任を負います。 –

関連する問題