在CORS上的TypeError为烧瓶休息

时间:2013-11-22 14:30:09

标签: python flask cors flask-restful

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

例如,修改Quickstart example

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

抛出:

TypeError: 'dict' object is not callable

我做错了吗?

3 个答案:

答案 0 :(得分:6)

我最近自己遇到过这个问题。 @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='*')]

答案 1 :(得分:0)

包装函数的返回值作为一个参数传递给flask.make_response(); 普通 Flask视图可以返回的任何内容都是可以接受的。装饰器与this Flask snippet基本相同。

因为Flask-restful Resourceflask.views.MethodView的子类,所以你应该直接将装饰器放在这里的方法上。如Decorating Views中所述,您应该在特殊的类属性decorators中列出视图装饰器,这是一个列表:

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

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

和Flask会将视图应用于HelloWorld.as_view()返回的实际视图方法,这是Flask在将路径分派给视图时实际调用的方法。

直接将它们应用于方法将只会使restful.Resource调度程序混淆,因为它期望方法将适合编码的python数据结构返回到JSON,这不是cors.crossdomain()返回的。

答案 2 :(得分:0)

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

如果你正在使用flask-security,那么在我的测试中添加auth decorators会有一些奇怪的行为。我推荐assert current_user.is_authenticated。如果您允许凭据,请确保CSRF保护。