python - 将 Flask 路由参数传递给装饰器

标签 python flask

我写了一个装饰器,试图检查我们是否有 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_dataupdate_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/

相关文章:

Python:如何解释 np.argmax() 的结果?

angularjs - 具有 HTML5 URL 模式的 AngularJS 的 Flask 路由

python - 无法将简单的 Flask 应用程序部署到 azure web 应用程序

使用 eventlet 和 Redis 进行 Flask socketio 调试会产生额外的绿色线程吗?

python - Flask admin - 将删除按钮移动到编辑 View

python - 在 Python 中使用 print 语句时如何删除字符串和参数之间的空格?

python - GAE 属性错误

python - 检查 .tfrecords 文件

python - 用 Pandas 附加到数据框单元格?

python - 对 gevent flask api 的多次调用未并行处理