我在将装饰器应用到我的家具时遇到问题Resource
。该Api
decorators
参数被应用到每个资源功能或怎么做我已经明白了decorators
参数?我的装饰器仅在启动时应用,而不是在每个函数调用中应用。我究竟做错了什么?
from flask import Flask, Blueprint
from flask.ext.restplus import Api, Resource, fields
app = Flask(__name__)
def my_decorator(input):
print("my decorator")
return input
api_blueprint = Blueprint('index', __name__, url_prefix='/0')
api = Api(api_blueprint, version='0.1.0', title='Index API',
description='The Index API helps to find things faster in the own database',
# ui=False,
decorators=[my_decorator]
)
app.register_blueprint(api_blueprint)
ns = api.namespace('index', description='Index API')
search_id_score_model = api.model('id', {
'id': fields.String(required=True),
'score': fields.Float(required=True)
})
search_result_model = api.model('result', {
'key': fields.String(required=True),
'ids': fields.List(fields.Nested(search_id_score_model, required=True), required=True)
})
@ns.route('/search/<string:query>')
class Search(Resource):
'''Serach'''
@api.marshal_list_with(search_result_model)
@my_decorator
def get(self, query):
'''fetch result by query'''
return None
if __name__ == '__main__':
app.run(debug=True)
有两个装饰器级别:API范围和Resource范围。
Api.decorators参数允许将装饰器应用于所有资源,而Resource.method_decorators将应用于给定资源的所有方法。
在您的情况下,问题是装饰者仅在应用后调用一次,而没有调用一次。您应该像这样修改装饰器:
def my_decorator(func):
def wrapper(*args, **kwargs):
print("my decorator")
return func(*args, **kwargs)
wrapper.__doc__ = func.__doc__
wrapper.__name__ = func.__name__
return wrapper
注意__doc__
和__name__
影响。第一个允许正确提取描述,__name__
允许避免自动命名冲突。如果您手动为每个资源指定一个端点,则该名称是可选的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句