在burn-restful上尝试新的CORS功能时,我发现装饰器只能在函数返回字符串时应用。
例如,修改Quickstart example:
class HelloWorld(restful.Resource):
@cors.crossdomain(origin='*')
def get(self):
return {'hello': 'world'}
抛出:
TypeError: 'dict' object is not callable
我做错了吗?
答案 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 Resource
是flask.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保护。