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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:15:08