7

フラスコレストフルで新しい CORS 機能を試しているときに、関数が文字列を返す場合にのみデコレータを適用できることがわかりました。

たとえば、クイックスタートの例を次のように変更します。

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

スロー:

TypeError: 'dict' object is not callable

私は何か間違ったことをしていますか?

4

3 に答える 3

0

ラップされた関数の戻り値は (1 つの引数として) に渡されflask.make_response()ます。通常のFlask ビューが返すことができるものは何でも受け入れられます。デコレーターは、基本的にこの Flask スニペットと同じです。

Flask-restfulResourceは のサブクラスであるため、ここでメソッドにデコレータを直接配置しないflask.views.MethodViewでください。ビューの装飾に記載されているように、リストである特別なクラス属性にビュー デコレーターをリストする必要があります。decorators

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

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

そしてFlaskは、によって返された実際のビューメソッドにビューを適用しますHelloWorld.as_view()。これは、ルートをビューにディスパッチするときにFlaskが実際に呼び出すものです。

それらをメソッドに直接適用すると、メソッドがrestful.ResourceJSONへのエンコードに適したPythonデータ構造を返すことを期待しているため、サーバーはディスパッチャーを混乱させるだけであり、cors.crossdomain()とにかく返されるものではありません。

于 2013-11-22T15:05:17.780 に答える