POST请求提交数据返回400 Bad Request错误原因排查
DRF接口POST写入数据持续返回400错误排查
基础信息
已确认目标接口支持POST请求,但请求始终无法正常执行。
前端提交逻辑
const mitgliedAdd = { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(mitarbeiter) }; fetch("/api/member", mitgliedAdd);
表结构参考
空数据结构示例如下:
{"number":"","firstName":"","lastName":"","begin":"","end":null,"email":"","durationStudentSelfGov":0}
本次待提交数据
{"number":"0148","firstName":"test","lastName":"test","begin":"2022-06-06","end":null,"email":"bla@bla.com","durationStudentSelfGov":5}
后端实现代码
基于Django REST Framework开发,接口和序列化器代码如下:
class MemberView(generics.ListCreateAPIView): queryset = Member.objects.all() serializer_class = MemberSerializer class MemberSerializer(serializers.ModelSerializer): class Meta: model = Member fields = "__all__"
排查方向(按出现概率排序)
- CSRF校验拦截:DRF默认使用Session认证时会强制开启CSRF校验,原生fetch请求不会自动携带csrftoken,直接发起POST会被中间件拦截返回400。可以从页面cookie中读取csrftoken值,在请求头中添加
X-CSRFToken: 读取到的token值即可;测试环境也可以临时给视图加@csrf_exempt装饰器跳过校验,生产环境不建议这么做。 - 字段约束冲突:核对Member模型的字段定义:
- 检查
number、email字段是否设置了unique=True,如果数据库中已经存在对应值的记录,序列化器校验不通过会直接返回400 - 检查
begin字段类型,如果模型定义为DateTimeField,传入的2022-06-06只有日期部分缺少时间信息,会触发格式校验失败 - 检查模型中是否存在未在空结构里列出、且标记为
null=False/blank=False无默认值的必填字段,这类字段缺失会直接返回400
- 检查
- 字段名不匹配:确认JS中序列化的
mitarbeiter对象的所有key,和模型字段名完全一致,拼写、大小写错误(比如驼峰命名写错、漏写字符)都会被判定为非法字段或字段缺失。 - 直接读取响应内容定位根因:DRF返回400状态码时,响应体里会明确返回具体错误字段和错误原因,直接打开浏览器开发者工具-网络面板,找到对应POST请求查看响应内容即可,比如返回
{"number":["该值已存在"]}就能直接定位是唯一键冲突,不需要盲目排查。
内容的提问来源于stack exchange,提问作者salteax1
相关产品推荐
相关产品推荐

