☰
从零构建学生信息管理 API:FastAPI + 内存存储 + Swagger 文档实战
2026/9/28 21:20:41 网站建设 项目流程

从零构建学生信息管理 API:FastAPI + 内存存储 + Swagger 文档实战
一、写在前面
在前后端协作的开发流程中,一个绕不开的话题是:当数据库表结构尚未定稿、前端页面却已写好时,如何让前端同学先联调起来?传统的做法是引入 MySQL 或 PostgreSQL,建表、写 ORM、配连接池——一套流程走完,演示还没开始,光环境就折腾了半天。

本文要分享的项目正是为了解决这类场景而诞生:用 Python 的 FastAPI 框架,配合进程内内存列表存储,在几百行代码之内完成一个具备完整增删改查(CRUD)能力的学生管理接口,并自动生成 Swagger 交互式文档。它不需要安装任何数据库,开箱即用,五分钟内就能跑起来。

二、技术选型:为什么是 FastAPI
在 Python 的 Web 接口领域,主流选择有 Flask、Django 和 FastAPI。Flask 足够简单,但路由、参数校验、序列化、文档生成这些能力都需要开发者自己组装。Django 功能全面,自带 Admin 后台和 ORM,但对于一个接口演示项目来说显得过于笨重。

FastAPI 恰好站在两者中间。它基于 Python 类型注解(Type Hints)构建,天生自带三大核心能力:

第一,自动数据校验。 在 Pydantic 模型里定义好字段类型和约束后,FastAPI 会在请求进入路由函数之前自动完成类型转换与合法性检查。例如年龄字段设定 0~150 的范围,传入 200 会直接返回 422 错误,根本不会进入业务代码。

第二,自动序列化与响应过滤。 声明响应模型后,FastAPI 会按模型定义输出 JSON,字段顺序和过滤都由框架完成,业务代码只需返回 Python 对象即可。

第三,自动生成文档。 FastAPI 依托 OpenAPI 规范,将每个接口的 URL、请求方法、参数、请求体模型、响应模型整理成标准化 JSON 文档,并内置 Swagger UI 和 ReDoc 两套可视化页面,浏览器打开就能调试接口。

这三大能力加起来,让 FastAPI 在“快速搭建演示型 API”这个场景中成为当前 Python 生态里投入产出比最高的选择。

三、项目结构设计
动手编码前先规划目录结构。虽然项目体量不大,但依然遵循分层设计,让每一层的职责足够清晰:

text
student-api/
├── app/
│ ├── main.py # 应用入口:创建实例、注册路由
│ ├── models.py # Pydantic 数据模型
│ ├── database.py # 内存存储层(线程安全)
│ └── routers/
│ └── students.py # 学生 CRUD 路由
├── tests/
│ └── test_students.py # 接口自动化测试
├── requirements.txt
├── run.py
└── README.md
这种“入口 → 路由 → 模型 → 存储”的分层结构带来了一个直接的好处:路由层和存储层彻底解耦。未来如果需要把内存存储替换为 MySQL,只需改动 database.py 一个文件,路由层和模型层完全不用动。

四、核心实现解析
4.1 数据模型层(models.py)
这一层用 Pydantic 定义了四种模型:StudentBase 定义学生共有的基础字段,StudentCreate 用于新增请求,StudentUpdate 用于更新请求,Student 是完整响应模型。

Pydantic 最强大的地方在于声明式校验。比如年龄字段:

python
age: int = Field(…, ge=0, le=150, description=“年龄”)
只写这一行,年龄范围校验就自动生效——传入负数或 200 岁都会被框架拦截并返回 422 错误。在传统框架中这往往需要手写大量 if 判断。

更新的局部更新特性同样值得一提。StudentUpdate 中所有字段都设置为 Optional,配合存储层的 model_dump(exclude_unset=True),可以实现“传哪个字段就更新哪个字段”的语义。例如只想修改年龄时,只需提交 {“age”: 21},其他字段保持不变。这在真实业务中非常实用,避免了每次更新都必须提交完整对象。

4.2 存储层(database.py)
存储层用 Python 内置的 list 作为容器,配合 threading.Lock 保证并发安全。为了模拟数据库的自增主键,使用了一个全局的 _next_id 计数器。

核心方法包括 create(新增并分配 ID)、get_all(返回全部)、get_by_id(按 ID 查找)、update(更新指定字段)、delete(删除)以及 count(统计总数)。

这里特别需要说明一点:内存存储是刻意为之的简化设计,它让项目在不依赖任何数据库服务的前提下即可运行,特别适合教学与演示。但它有一个明显的代价——服务进程一旦重启,所有数据都会丢失。因此,这个项目并不适合生产环境,生产系统需要使用真正的持久化存储。

4.3 路由层(students.py)
路由层将学生管理的所有接口集中在一个文件中,通过 APIRouter(prefix=“/students”, tags=[“学生管理”]) 统一管理,并在 main.py 中挂载到 /api/v1 前缀下。

接口遵循 RESTful 风格,用 HTTP 方法表达操作意图:

GET /api/v1/students —— 查询学生列表,支持按姓名模糊搜索、班级筛选、年龄区间过滤

POST /api/v1/students —— 新增学生,成功返回 201 Created

GET /api/v1/students/{id} —— 查询单个学生,不存在返回 404

PUT /api/v1/students/{id} —— 更新学生信息,支持局部更新

DELETE /api/v1/students/{id} —— 删除学生,成功返回 204 No Content

路径统一使用 /api/v1 前缀有两个好处:一是表示接口版本,未来不兼容升级时可新增 v2 让新旧版本并存;二是让资源路径与业务前缀清晰分离,便于后续接入网关或反向代理。

4.4 自动生成的 Swagger 文档
这是 FastAPI 最“白送”的能力。服务启动后,访问 http://127.0.0.1:8000/docs 即可看到完整的 Swagger UI 页面。页面中每个接口的请求方法、路径、参数说明、请求体结构、响应模型都自动渲染出来,并且可以直接在页面上点击“Try it out”发起真实请求。

这些文档完全来源于代码中的类型注解和 summary、description 参数,代码修改后文档自动同步,彻底杜绝了“文档写一套、代码跑另一套”的问题。

五、测试与验证
项目配套了基于 pytest 和 TestClient 的接口自动化测试,覆盖了新增、查询、更新、删除以及参数校验失败等核心场景。测试通过 autouse=True 的 fixture 在每个用例前重置内存数据,保证测试之间的隔离性。

运行测试只需执行:

bash
pytest tests/ -v
六、提交到 AtomGit
代码写完后,需要提交到 AtomGit 代码托管平台。流程如下:

首先登录 AtomGit,点击页面右上角的 + 号创建新仓库,仓库名称填写 student-api(需符合标识符命名规范)。创建完成后,进入 个人设置 → 访问令牌 → 新建访问令牌,勾选 repo 权限,生成并保存令牌密钥。

然后在终端执行:

bash
git init
git add .
git commit -m “feat: 学生信息管理API初始版本”
git remote add origin https://atomgit.com/LSCC/student-api.git
git push -u origin main
首次推送时输入用户名和令牌密钥即可。需要注意:令牌密钥只在创建时显示一次,务必妥善保存,后续拉取和提交代码都需要用它作为密码。

七、总结与展望
这个项目虽然代码量不大,但麻雀虽小五脏俱全。它完整地跑通了“数据建模 → 存储层设计 → RESTful 接口实现 → 自动生成文档 → 接口测试”这条链路,是理解后端接口开发全貌的一个极佳起点。

以下几点值得特别回顾:

第一,FastAPI 用最少的样板代码把“定义接口”和“写文档”这两件事合二为一,类型注解既是校验规则也是文档来源。

第二,内存存储虽然简单,但配合线程锁和自增 ID 的设计,已经具备了存储层的基本形态,未来替换为真实数据库时接口层无需改动。

第三,即便在小型项目中,分层设计依然有其价值——它让代码的职责边界清晰,为后续扩展保留了平滑的演进路径。

如果要将这个项目进一步扩展,可以从以下方向入手:接入 SQLite 或 MySQL 实现数据持久化;增加 JWT 用户认证;添加分页参数;用 Docker 容器化部署到云服务器。这些都将在真实的生产场景中派上用场。

项目仓库地址:https://atomgit.com/LSCC/student-api

作业信息:

学号:48052402036

姓名:罗思畅

班级:24大数据2班

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询