跳到主要内容

FastAPI 修改学生信息接口实现教程

在上一节完成学生信息查询接口之后,本节我们继续实现修改学生信息的接口。该接口使用 PUT 方法,需要传递学生 ID 以及修改后的学生数据。核心逻辑是:先根据 ID 判断学生是否存在,存在则更新,不存在则返回错误。

下面按照「目标 → 代码实现 → 测试 → 结果 → 小结」的完整链路进行讲解。

一、接口目标​

  • 请求方法:PUT
  • 路径参数:student_id(整型),用于定位要修改的学生
  • 请求体:student(字典类型),携带修改后的学生信息
  • 业务规则:
    • 若 ID 存在 → 更新对应记录并返回更新后的学生信息
    • 若 ID 不存在 → 抛出异常,返回 404 错误

二、代码实现​

1. 定义 PUT 路由与函数​

由于修改接口与查询接口结构非常类似,可以直接拷贝原接口后改造:将方法改为 put,函数命名为 update_student。

@app.put("/students/{student_id}")
def update_student(student_id: int, student: dict):
...

这里函数接收两个参数:

  • student_id:整型,表示要修改的学生 ID
  • student:字典类型,表示修改后的学生信息

2. 遍历数据库并判断 ID 是否存在​

使用 enumerate 遍历 fake_student_db,它同时产生两个值:序号(从 0 开始)和列表中的每个元素(即学生字典)。遍历过程中直接判断字典中的 ID 是否等于传入的 student_id。

for index, s in enumerate(fake_student_db):
if s["id"] == student_id:
...

3. 构造更新后的学生信息(字典拆包)​

找到匹配项后,通过字典拆包得到更新后的数据。这里的关键是拆包顺序:

updated = {**s, **student, "id": student_id}
  • 先拆原始数据 s
  • 再拆接收到的 student
  • 最后补上 id

由于字典中后面的键值对会覆盖前面的键值对,把接收到的 student 放在原始 s 之后,就能用新数据覆盖旧数据。最后单独指定 id,防止用户随意篡改 ID。

关于拆包顺序,视频中专门做了验证:先拆 s 再拆 new,new 中的 name 会覆盖 s 中的 name;若把 new 放前面、s 放后面,则 s 会反过来覆盖 new。因此顺序必须遵循「原始在前、新数据在后」。

在 IDLE 中验证字典拆包顺序:后拆的键值对覆盖先拆的

4. 更新数据库并返回结果​

根据遍历得到的 index,把更新后的数据替换进 fake_student_db,然后返回更新后的学生信息。

fake_student_db[index] = updated
return updated

注意 return 位于 if 语句内部:一旦找到匹配项就立即返回,循环不再继续执行,直接退出。

update_student 函数完整代码:遍历判断、字典拆包、更新数据库并返回

5. 处理 ID 不存在的情况​

如果整个循环都没有找到匹配的 student_id,则在循环外抛出异常,复用前面定义好的「学生 ID 不存在」错误。

raise HTTPException(status_code=404, detail="学生 ID 不存在")
循环外抛出 404 异常,提示学生 ID 不存在

完整代码如下:

@app.put("/api/v1/students/{student_id}", tags=["学生管理"])
def update_student(student_id: int, student: dict):
for index, s in enumerate(fake_students_db):
if s["id"] == student_id:
# 获取更改后的学生信息
updated = {**s, **student}
fake_students_db[index] = updated
return updated
# 找不到抛出异常
raise HTTPException(status_code=404, detail=f"学生ID为{student_id} 不存在")

三、接口测试​

刷新 Swagger 文档页面,找到 PUT 请求,点击 Try it out,此时需要填写两个参数:学生 ID 和请求体。

测试一:修改存在的学生​

将第一个学生的 name 修改为 Andy,其余字段不变。请求体如下(注意务必使用英文双引号,不要使用中文双引号):

{
"name": "Andy"
}

点击 Execute 执行。

PUT 请求执行成功,返回更新后的学生信息,name 已变为 Andy

可以看到修改成功,返回结果中 name 已变化,其他字段保持不变。

测试二:修改不存在的学生​

将学生 ID 改为 100 再次执行。

学生 ID 为 100 时返回 404,提示学生 ID 不存在

输出结果为 404,提示「学生 ID 100 不存在(not found)」,符合预期。

四、小结​

本节完成了修改学生信息接口,要点回顾:

  1. 使用 PUT 方法,同时接收路径参数 student_id 与请求体 student。
  2. 通过 enumerate 遍历数据库,边遍历边判断 ID 是否匹配。
  3. 利用字典拆包构造新数据,顺序为「原始数据 → 新数据 → id」,依靠后者覆盖前者的特性实现字段更新。
  4. 找到即更新并 return,未找到则在循环外抛出 404 异常。
  5. 测试验证了正常修改与 ID 不存在两种场景,结果均符合预期。

提示:当前 ID 由用户直接传入,后续可以加入参数校验来进一步规范。

课程推荐

想系统学习这门课程?

你已阅读完本文。需要更完整的知识体系,可以继续了解「FastAPI 项目实战」。

查看课程详情