Django Ninja API测试返回400错误,Swagger正常但测试客户端失败求助
排查Django-Ninja API测试返回400的问题
以下是针对你的问题的具体排查方向:
1. 请求数据格式不匹配
Django-Ninja的API默认接收JSON格式的请求体,但django.test.Client的post方法如果使用data参数传递数据,会以表单编码(application/x-www-form-urlencoded)发送,这和Swagger生成的curl请求(默认发送JSON)不一致,导致Schema验证失败返回400。
修复方法:测试时改用json参数传递数据:
# 错误写法(表单编码) response = client.post('/api/countries/', {'name': 'Japan'}) # 正确写法(JSON格式) response = client.post('/api/countries/', json={'name': 'Japan'})
对比Swagger生成的curl,里面必然包含-H "Content-Type: application/json"和-d '{"name":"xxx"}',这就是JSON格式的证明。
2. Schema字段验证不通过
检查CountryAddSchema的定义和测试传递的字段是否完全匹配:
- 确认Schema中的必填字段是否都在测试请求里传了(比如Schema要求
code字段必填,测试里只传了name) - 检查字段名拼写是否一致(比如Schema里是
country_code,测试里写成code) - 检查字段类型是否匹配(比如Schema要求
population是整数,测试里传了字符串)
可以在测试里打印response.json()查看具体错误信息,快速定位验证失败原因:
print(response.json()) # 示例输出:{"detail": [{"loc": ["name"], "msg": "field required", "type": "value_error.missing"}]}
3. 认证/权限缺失
如果你的API配置了认证(比如Token认证),Swagger可能已经自动携带了认证令牌,但测试请求里没有添加,导致API返回400(部分场景下认证失败会被Schema验证拦截返回400)。
修复方法:在测试请求里添加认证头:
# 假设使用Token认证 response = client.post( '/api/countries/', json={'name': 'Korea'}, HTTP_AUTHORIZATION='Token your_test_token' )
4. CSRF令牌问题
虽然Django-Ninja默认会为API视图禁用CSRF保护,但如果项目配置有特殊改动,可能导致测试请求需要CSRF令牌。可以尝试在测试里临时禁用CSRF检查:
from django.test import override_settings @override_settings(DEBUG=True) def test_add_correct(self): # 测试代码 pass
或者在请求里携带CSRF令牌:
csrf_token = client.get('/api/csrf/').json()['csrfToken'] response = client.post( '/api/countries/', json={'name': 'France'}, HTTP_X_CSRFTOKEN=csrf_token )
优先从「请求数据格式」方向排查,这是此类问题最常见的诱因,再结合response.json()的错误信息进一步定位。
内容的提问来源于stack exchange,提问作者niaei
相关产品推荐
相关产品推荐

