Django接口接收POST请求总是重定向到登录页返回BAD_REQUEST错误
问题原因
- 前端
fetch请求默认不会携带Cookie凭证,你登录后存储在浏览器的sessionid没有随POST请求提交到服务端,Django识别不到当前登录用户,触发NoteCreateView继承的LoginRequiredMixin校验规则,自动重定向到登录页,拼接next参数指向你请求的接口地址。 - 接口原有代码存在逻辑错误:序列化器校验失败时返回
serializer.data而非错误信息,是后续返回BAD_REQUEST的诱因。
解决方法
- 首先修改前端fetch请求配置,添加
credentials: 'include'参数,强制请求携带Cookie:
e.preventDefault() const note = document.getElementById('add-note').value let date = new Date() const data = { 'note':note, 'date_created':date } let url = 'http://localhost:8000/api/notes/create/' fetch(url, { method:'POST', credentials: 'include', // 新增此行 headers:{ 'content-type':'application/json', 'X-CSRFToken':csrftoken }, body:JSON.stringify(data) }) .then(res => { getAllNotes() document.getElementById('form').reset() }) })
- 修正后端接口错误返回逻辑,校验失败时返回序列化器的错误信息:
class NoteCreateView(LoginRequiredMixin, APIView): def post(self, *args, **kwargs): print(self.request.user) data = (self.request.data) data['id'] = self.request.user.id print(data) serializer = NoteSerializer(data=data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=HTTP_201_CREATED) # 修改下行的返回内容 return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
- 本地跨域测试如果仍有问题,可在
settings.py中添加如下配置:
CSRF_COOKIE_SAMESITE = 'Lax' SESSION_COOKIE_SAMESITE = 'Lax'
内容的提问来源于stack exchange,提问作者shubham karande
相关产品推荐
相关产品推荐

