我写了一个装饰器,试图检查我们是否有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
Run Code Online (Sandbox Code Playgroud)
我有两条路线,一个是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
Run Code Online (Sandbox Code Playgroud)
当我运行一个命中的测试时update_contact
,我得到以下异常:
TypeError: decorator() got an unexpected keyword argument 'contact_id'
Run Code Online (Sandbox Code Playgroud)
但它看起来像create_contact
预期的那样工作.
为什么contact_id
被传入decorator()
?
Jam*_*ter 10
我相信你只是缺少一件事,那就是实际调用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
Run Code Online (Sandbox Code Playgroud)
具体解释是,你希望发生(和正在发生的事情中create contact
)是该视图的功能正在被修改decorator
产生的require_post_data
.在update_contact
上面,实际发生的是视图函数被传递给require_post_data
它自己并简单地用作required_fields
参数的值.这不会导致错误如此require_post_data
愉快地返回decorator
,然后在您点击时将其路由到/<int>
,导致它contact_id
作为关键字参数传递,从而导致您看到的错误.
归档时间: |
|
查看次数: |
4616 次 |
最近记录: |