7

在 flask-restful 上尝试新的 CORS 功能时,我发现只有在函数返回字符串时才能应用装饰器。

例如,修改快速入门示例

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

抛出:

TypeError: 'dict' object is not callable

难道我做错了什么?

4

3 回答 3

7

我最近自己也遇到了这个问题。@MartijnPieters 是正确的,decorators不能在视图的单个方法上调用。

我创建了一个包含decorator列表的抽象基类。消费类Resource(来自flask-restful)也继承了基类,即实际将装饰器列表应用于视图的类。

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

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

不。

只需在创建 Api 实例后将装饰器列表添加到参数中

api = Api(app)
api.decorators=[cors.crossdomain(origin='*')]
于 2014-01-04T20:59:52.480 回答
0

包装函数的返回值(作为一个参数)传递给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.Resource调度程序感到困惑,因为它期望方法返回适合编码为 JSON 的 Python 数据结构,而这cors.crossdomain()无论如何都不是返回的。

于 2013-11-22T15:05:17.780 回答
0

我发现你仍然可以使用装饰器,只要你返回一个字符串或 JSON 响应(这对于 API 来说可能是一个很好的做法)。如果您想做特定于路由的 CORS 标头,这一点很重要,使用装饰器会使生活变得更轻松。有关更多信息,请参阅此合并的拉取请求: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')

如果您使用的是烧瓶安全性,那么在我的测试中添加 auth 装饰器会有一些奇怪的行为。我建议assert current_user.is_authenticated改为。如果您允许凭据,请确保 CSRF 保护。

于 2016-02-14T12:04:39.903 回答