【问题标题】:How to use Decorators with Flask-RESTPlus for each function call?如何为每个函数调用使用带有 Flask-RESTPlus 的装饰器?
【发布时间】:2016-01-02 12:53:37
【问题描述】:

我无法将装饰器应用到我的ResourceApi 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)

【问题讨论】:

  • 好的,我找到了method_decorators,有了它,我可以将我的装饰器应用于每个方法调用。我仍然想知道如何理解来自restful.Api 的装饰器参数,以及如何不为每个资源重复自己。

标签: python python-decorators flask-restplus


【解决方案1】:

有两个装饰器级别:API 范围和资源范围。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-02
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2014-06-01
    • 2012-12-05
    • 1970-01-01
    相关资源
    最近更新 更多