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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:06:11