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

FastAPI中GET/POST正常但PUT/DELETE请求无法运行问题求解

FastAPI PUT/DELETE请求失效修复方案

你的PUT、DELETE接口无法正常运行,是代码存在语法错误、参数声明缺失、逻辑错误三类问题,逐个修复即可。

核心错误点

  • 路由路径语法错误:两个版本的DELETE路由路径/{full_name、/{student_full_name均缺少路径参数的闭合右花括号},FastAPI无法正确识别路由规则
  • 路径参数未声明接收:PUT路由路径中定义了{student_name}路径参数,但函数参数列表未声明该参数,FastAPI启动/请求时会直接抛出参数缺失错误;DELETE路由存在同样问题
  • 表单参数未正确声明:直接在函数参数列表写参数名时,FastAPI默认将其识别为URL查询参数,无法接收表单提交的字段值,需要显式用Form()标记表单参数
  • 业务逻辑错误:第二版PUT路由写死路径为/full_name,没有预留动态路径参数位置;遍历学生字典时直接访问键的citizenship属性(字典遍历默认返回的是字符串键,如student_1,不存在该属性);更新、删除逻辑完全缺失或写反
  • 类型不匹配:存储的citizenship字段为整数类型,PUT接口中错误声明为字符串类型,会导致值匹配失败

修正后完整可运行代码

from fastapi import FastAPI, Form

app = FastAPI()

Student = {
    'student_1': {'full_name': 'Sarita Banjara', 'address': 'panauti', 'dob': 'dec 13 2001', 'citizenship': 12456},
    'student_2': {'full_name': 'Sajana Gurung', 'address': 'pokhara', 'dob': 'jun 07 2001', 'citizenship': 13457},
    'student_3': {'full_name': 'Mahendra Wagle', 'address': 'banepa', 'dob': 'aug 25 2001', 'citizenship': 14258},
    'student_4': {'full_name': 'Bishal Jung', 'address': 'santinagar', 'dob': 'nov 20 2001', 'citizenship': 15987},
    'student_5': {'full_name': 'Aayush Maskey', 'address': 'gaushala', 'dob': 'dec 23 1990', 'citizenship': 24356},
}

# 查询所有学生
@app.get("/")
async def read_all_student():
    return Student

# 新增学生
@app.post("/")
async def create_new_entry(
    student_full_name: str = Form(),
    student_address: str = Form(),
    student_dob: str = Form(),
    student_citizenship: int = Form()
):
    current_student_name = 0
    if len(Student) > 0:
        for student in Student:
            x = int(student.split('_')[-1])
            if x > current_student_name:
                current_student_name = x
    new_student_key = f'student_{current_student_name + 1}'
    Student[new_student_key] = {
        'full_name': student_full_name,
        'address': student_address,
        'dob': student_dob,
        'citizenship': student_citizenship
    }
    return Student[new_student_key]

# 更新指定学生信息
@app.put("/{student_key}")
async def update_student(
    student_key: str,
    student_full_name: str = Form(),
    student_address: str = Form(),
    student_dob: str = Form(),
    student_citizenship: int = Form()
):
    if student_key not in Student:
        return {"error": f"学生{student_key}不存在"}
    Student[student_key] = {
        'full_name': student_full_name,
        'address': student_address,
        'dob': student_dob,
        'citizenship': student_citizenship
    }
    return Student[student_key]

# 删除指定学生
@app.delete("/{student_key}")
async def delete_student(student_key: str):
    if student_key not in Student:
        return {"error": f"学生{student_key}不存在"}
    deleted_student = Student.pop(student_key)
    return {"message": "删除成功", "deleted_student": deleted_student, "remaining": Student}

PyCharm中curl调试示例

启动服务后(默认地址为http://127.0.0.1:8000),可以直接在PyCharm的终端执行以下命令测试四类请求:

  • GET查询所有学生:
    curl http://127.0.0.1:8000/
  • POST新增学生:
    curl -X POST http://127.0.0.1:8000/ -d "student_full_name=测试用户&student_address=测试地址&student_dob=jan 01 2000&student_citizenship=99999"
  • PUT更新student_1的信息:
    curl -X PUT http://127.0.0.1:8000/student_1 -d "student_full_name=更新后名字&student_address=更新后地址&student_dob=jan 01 2024&student_citizenship=11111"
  • DELETE删除student_5:
    curl -X DELETE http://127.0.0.1:8000/student_5

测试时也可以直接访问FastAPI自带的Swagger文档http://127.0.0.1:8000/docs,页面会自动生成所有接口的调试表单,不需要手动拼接curl命令。

内容的提问来源于stack exchange,提问作者Mahendra Wagle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:06:27