You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用pytest提交表单数据?Flask测试中WTForms校验失败求解决

问题原因

WTForms 的 form.validate_on_submit() 方法默认仅从 request.form(对应 application/x-www-form-urlencoded 格式的表单请求体)中读取字段值。你当前测试用例提交的是 Content-Type: application/json 格式的JSON数据,所有字段都存储在 request.json 中,WTForms 默认不会主动读取这部分数据,因此会判定所有必填字段缺失。

解决方案

根据你的接口设计需求,可以二选一:

方案1:调整测试用例,提交表单格式数据(适配现有后端表单逻辑)

如果你的接口本来就设计为接收普通表单提交,直接修改测试代码即可,不需要序列化JSON:

def test_create_request():
    with app.test_client() as test_client:
        app_url = '/requests/'
        with app.app_context():
            new_request = get_new_request()
            # 直接传递字典,test_client会自动编码为表单格式
            resp = test_client.post(app_url, data=new_request)
            assert resp.status_code == 200
            s = json.loads(resp.data)
            assert s['success'] == True

方案2:调整后端验证逻辑,支持JSON格式请求

如果你的接口确实需要接收JSON格式的请求,初始化表单时手动指定数据源为请求的JSON数据即可:

# 视图函数代码修改示例
from flask import request, jsonify

@app.route('/requests/', methods=['POST'])
def create_request():
    # 初始化表单时传入JSON数据作为formdata参数
    form = RequestForm(formdata=request.get_json())
    # JSON接口无需使用validate_on_submit(该方法会校验CSRF、判断请求方法),直接调用validate即可
    if form.validate():
        # 原有业务逻辑
        return jsonify(success=True)
    return jsonify(success=False, errors=form.errors), 400
补充注意事项

如果选择方案2,针对JSON接口建议关闭对应路由的CSRF校验(WTForms默认开启CSRF保护,仅适用于普通表单场景)。

内容的提问来源于stack exchange,提问作者boing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:54:07