使用Django REST Framework创建API遇POST请求400错误求助
解决DRF POST请求400 Bad Request错误的排查步骤
第一步:先获取详细错误信息
400只是笼统的错误提示,必须拿到具体错误内容才能定位问题:
- 前端修改代码,添加catch块打印详细错误:
axios.post('/api/posts/', form, { "headers": { 'Content-Type': 'application/json', } }) .then(response => console.log(response.data)) .catch(error => { console.error('请求错误详情:', error.response.data); // 打印具体错误信息 });
- 或者后端临时在视图里添加调试代码:
def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) if not serializer.is_valid(): print(serializer.errors) # 控制台输出错误详情 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) return self.create(request, *args, **kwargs)
常见问题及修复方案
1. author字段未正确传递
author是必填外键,前端需要传递当前登录用户的ID,如果没传、传错ID或用户未登录,都会触发验证失败。
更合理的做法是后端自动绑定当前用户,不需要前端传递:
- 修改视图类,重写
perform_create方法:
class PostList(GenericAPIView, ListModelMixin, CreateModelMixin): queryset = Post.objects.all() serializer_class = PostSerializer def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs) def perform_create(self, serializer): # 自动设置当前登录用户为作者 serializer.save(author=self.request.user)
- 同时修改序列化器,把不需要前端提交的字段设为只读:
class PostSerializer(serializers.ModelSerializer): class Meta: model = Post fields = ["author", "title", "text", "pk", 'publicationDate'] read_only_fields = ["pk", "publicationDate", "author"] # 禁止前端修改这些字段
2. 序列化器包含不必要的可写字段
pk是自动生成的主键,publicationDate允许为空且由publish方法控制,这两个字段都不应该开放给前端提交,必须设为只读(如上例)。
3. 模型creationDate默认值错误
当前代码中creationDate = models.DateTimeField(default=timezone.now())会导致所有新创建的Post的creationDate固定为项目启动时间,改为不带括号的函数引用即可:
creationDate = models.DateTimeField(default=timezone.now)
4. 前端请求数据格式冲突
如果form是FormData对象,手动设置Content-Type: application/json会导致数据解析失败,因为FormData默认应使用multipart/form-data;如果是JSON对象,axios会自动设置正确的请求头,可去掉手动配置的headers:
axios.post('/api/posts/', form) .then(response => console.log(response.data)) .catch(error => console.error('请求错误详情:', error.response.data));
内容的提问来源于stack exchange,提问作者sadra
相关产品推荐
相关产品推荐

