2015-10-05 65 views
2

我有問題可以將裝飾器應用於我的ResourceApidecorators參數被應用於每個資源函數或我該如何理解decorators參數?我的裝飾器只在啓動時應用,而不是在每個函數調用中應用。我究竟做錯了什麼?如何將Flask-RESTPlus的裝飾器用於每個函數調用?

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) 
+0

好的,我找到了[method_decorators](https://flask-restful.readthedocs.org/en/latest/extending.html#resource-method-decorators),並且可以將我的裝飾器應用於每個方法調用。我仍然想知道如何理解「restful.Api」中的裝飾器參數,以及如何不重複每個資源。 – swiesend

回答

5

有兩個裝飾器級別: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__允許避免自動命名衝突。如果您爲每個資源手動指定端點,則名稱是可選的。

相關問題