我写了一个装饰器,试图检查我们是否有 Flask POST 路由的发布数据:
这是我的装饰器:
def require_post_data(required_fields=None):
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
for required_field in required_fields:
if not request.form.get(required_field, None):
return jsonify({"error": "Missing %s from post data." %
required_field}), 400
else:
if not request.form:
return jsonify({"error": "No post data, aborting."}), 400
return f(*args, **kwargs)
return decorated_function
return decorator
我有两条路线,一 strip 有 URL 参数,另一条没有:
from flask import Blueprint, jsonify, request
mod = Blueprint('contacts', __name__, url_prefix='/contacts')
@mod.route('/', methods=['POST'])
@require_post_data(['customer_id', 'some_other_required_field'])
def create_contact():
# Do some business
@mod.route('/<int:contact_id>', methods=['POST'])
@require_post_data
def update_contact(contact_id):
# Do some business
当我运行命中 update_contact
的测试时,出现以下异常:
TypeError: decorator() got an unexpected keyword argument 'contact_id'
但看起来 create_contact
正在按预期工作。
为什么要将 contact_id
传递给 decorator()
?
最佳答案
我相信你只是错过了一件事,那就是实际调用 require_post_data
在 update_contact
中生成装饰器函数路线。这应该修复它:
@mod.route('/<int:contact_id>', methods=['POST'])
@require_post_data() # <- note the parens
def update_contact(contact_id):
# Do some business
详细的解释是您期望发生的事情(以及 create contact
中发生的事情)是 View 函数正在被 decorator
修改。 制作 require_post_data
.在你的update_contact
上面,实际发生的是 View 函数被传递给 require_post_data
本身 并仅用作 required_fields
的值范围。这不会导致错误,所以 require_post_data
愉快地返回decorator
当你点击 /<int>
时,它会被路由到, 导致它通过 contact_id
作为关键字参数,导致您看到的错误。
关于python - 将 Flask 路由参数传递给装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18605764/