[英]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.