【发布时间】:2013-09-04 05:04:32
【问题描述】:
我编写了一个装饰器,它试图检查我们是否有 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
我有两条路线,有一个 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装饰器的required_fields字典? -
错字 - 那应该是一个列表:
@require_post_data(['customer_id', 'some_other_required_field'])