Django REST Framework调用create接口返回405错误,React请求失败如何解决
问题排查&修复方案
- 1. 核心错误:createPerson未接收事件参数导致阻止默认提交失效
你当前的createPerson函数定义没有声明形参e,代码里的e.preventDefault()执行时报错,表单默认的GET提交行为没有被阻止,直接向仅允许POST的接口发送了GET请求,触发405错误。
修复方法:修改函数定义为let createPerson = (e) => { - 2. fetch回调逻辑错误
你当前.then(setPerson(...))的写法会在fetch发起时立刻执行重置表单逻辑,不会等待请求完成,且缺少请求错误捕获、路由跳转等后续逻辑。 - 3. 文件上传格式错误
你使用了type="file"的图片上传字段,JSON格式无法直接传输文件内容,需要改用FormData格式提交请求,同时删除请求头里的Content-Type配置,让浏览器自动设置带boundary的正确值。 - 4. 可选检查项:路由匹配校验
确认Django的urls.py中对应的路由配置为path('api/person-create/', create_person),和前端请求的URL完全匹配,避免因尾部斜杠不匹配触发重定向后转为GET请求。
修复后的create.js核心代码
let createPerson = (e) => { e.preventDefault() // 使用FormData处理文件上传 const formData = new FormData() Object.keys(person).forEach(key => { formData.append(key, person[key]) }) fetch(`/api/person-create/`, { method: "POST", // 不要手动设置Content-Type,让浏览器自动处理FormData的边界值 body: formData }) .then(res => res.json()) .then(data => { // 请求成功后再重置表单 setPerson({ name:"", about:"", email:"", image:"", }) // 可选:成功后跳转回列表页 history.push('/') }) .catch(err => console.error('创建失败:', err)) } // 额外修复:文件上传的handleChange需要单独处理文件对象,不是拿value let handleChange = (e) => { const value = e.target.type === 'file' ? e.target.files[0] : e.target.value setPerson({...person, [e.target.id]: value}); }
额外优化建议(后端)
当前后端视图校验失败时会直接返回序列化器的错误数据,但状态码是200,建议修改为校验失败时返回400状态码,方便前端识别错误:
from rest_framework import status @api_view(['POST']) def create_person(request): serializer = PersonSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
内容的提问来源于stack exchange,提问作者naveed
相关产品推荐
相关产品推荐

