簡體   English   中英

Python Flask中的裝飾器

[英]Decorator in Python-Flask

#==========================================
# Current API
#==========================================

@blueprint.route('/list/<int:type_id>/', methods=["GET"])
@blueprint.route('/list/<int:type_id>/<int:object_id>', methods=["GET"])
@blueprint.route('/list/<int:type_id>/<int:object_id>/<int:cost_id>', methods=["GET"])
@login_required
def get_list(type_id, object_id=None, cost_id=None):
    # Do something 
    pass

我們在Flask項目中將藍圖用於API分組。

現在的要求是編寫一個裝飾器,以驗證URL中傳遞的API參數,例如type_id,object_id,cost_id等

#==========================================
# New Requested feature in API
#==========================================
from functools import wraps

def request_validator():
"""
This function will validates requests and it's parameters if necessary
"""

    def wrap(f):
        @wraps(f)
        def wrapped(self, *args, **kwargs):

            # TODO -- Here I want to validate before actual handler
            # 1) type_id, 
            # 2) object_id, 
            # 3) cost_id
            # And allow handler to process only if validation passes Here

            if type_id not in [ 1,2,3,4,5 ]:
                return internal_server_error(errormsg="Invalid Type ID")

        return f(self, *args, **kwargs)
    return wrapped
return wrap


@blueprint.route('/list/<int:type_id>/', methods=["GET"])
@blueprint.route('/list/<int:type_id>/<int:object_id>', methods=["GET"])
@blueprint.route('/list/<int:type_id>/<int:object_id>/<int:cost_id>', methods=["GET"])
@login_required
@request_validator
def get_list(type_id, object_id=None, cost_id=None):
    # Do something 
    pass

但是我遇到了beow錯誤,無法運行該應用程序,我丟失了什么嗎?

TypeError: request_validator() takes 0 positional arguments but 1 was given

您的request_validator裝飾器應接受函數作為參數。 當你寫:

@request_validator
def get_list():
    pass

它的含義與:

def get_list():
    pass
get_list = request_validator(get_list)

因此,您的裝飾器應如下所示(比您的示例簡單一些):

def request_validator(f):
    @wraps(f)
    def wrapped(*args, **kwargs):
        if type_id not in [ 1,2,3,4,5 ]:
            return internal_server_error(errormsg="Invalid Type ID")
        return f(*args, **kwargs)
    return wrapped

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM