gpt4 book ai didi

python - 如何为每个函数调用使用带有 Flask-RESTPlus 的装饰器?

转载 作者:行者123 更新时间:2023-12-04 14:11:04 24 4
gpt4 key购买 nike

我在将装饰器应用于我的 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-wide 和 Resource-wide。

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__允许避免自动命名冲突。 姓名 如果您为每个资源手动指定端点,则是可选的。

关于python - 如何为每个函数调用使用带有 Flask-RESTPlus 的装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32955845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com