如何使用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
相关产品推荐
相关产品推荐

