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:整型,表示要修改的学生 IDstudent:字典类型,表示修改后的学生信息
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。因此顺序必须遵循「原始在前、新数据在后」。
4. 更新数据库并返回结果
根据遍历得到的 index,把更新后的数据替换进 fake_student_db,然后返回更新后的学生信息。
fake_student_db[index] = updated
return updated
注意 return 位于 if 语句内部:一旦找到匹配项就立即返回,循环不再继续执行,直接退出。
5. 处理 ID 不存在的情况
如果整个循环都没有找到匹配的 student_id,则在循环外抛出异常,复用前面定义好的「学生 ID 不存在」错误。
raise HTTPException(status_code=404, detail="学生 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 执行。
可以看到修改成功,返回结果中 name 已变化,其他字段保持不变。
测试二:修改不存在的学生
将学生 ID 改为 100 再次执行。
输出结果为 404,提示「学生 ID 100 不存在(not found)」,符合预期。
四、小结
本节完成了修改学生信息接口,要点回顾:
- 使用
PUT方法,同时接收路径参数student_id与请求体student。 - 通过
enumerate遍历数据库,边遍历边判断 ID 是否匹配。 - 利用字典拆包构造新数据,顺序为「原始数据 → 新数据 → id」,依靠后者覆盖前者的特性实现字段更新。
- 找到即更新并
return,未找到则在循环外抛出 404 异常。 - 测试验证了正常修改与 ID 不存在两种场景,结果均符合预期。
提示:当前 ID 由用户直接传入,后续可以加入参数校验来进一步规范。
想系统学习这门课程?
你已阅读完本文。需要更完整的知识体系,可以继续了解「FastAPI 项目实战」。
查看课程详情