7

にデコレータを適用するのに問題があります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)
4

1 に答える 1

9

API 全体とリソース全体の 2 つのデコレータ レベルがあります。

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__により、自動命名衝突を回避できます。各リソースのエンドポイントを手動で指定する場合、名前はオプションです

于 2015-10-06T08:47:25.190 に答える