从零构建学生信息管理 API:FastAPI + 内存存储 + Swagger 文档实战

发布时间:2026/9/28 21:20:46
从零构建学生信息管理 API:FastAPI + 内存存储 + Swagger 文档实战 从零构建学生信息管理 APIFastAPI 内存存储 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 生态里投入产出比最高的选择。三、项目结构设计动手编码前先规划目录结构。虽然项目体量不大但依然遵循分层设计让每一层的职责足够清晰textstudent-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 最强大的地方在于声明式校验。比如年龄字段pythonage: int Field(…, ge0, le150, description“年龄”)只写这一行年龄范围校验就自动生效——传入负数或 200 岁都会被框架拦截并返回 422 错误。在传统框架中这往往需要手写大量 if 判断。更新的局部更新特性同样值得一提。StudentUpdate 中所有字段都设置为 Optional配合存储层的 model_dump(exclude_unsetTrue)可以实现“传哪个字段就更新哪个字段”的语义。例如只想修改年龄时只需提交 {“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 CreatedGET /api/v1/students/{id} —— 查询单个学生不存在返回 404PUT /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 的接口自动化测试覆盖了新增、查询、更新、删除以及参数校验失败等核心场景。测试通过 autouseTrue 的 fixture 在每个用例前重置内存数据保证测试之间的隔离性。运行测试只需执行bashpytest tests/ -v六、提交到 AtomGit代码写完后需要提交到 AtomGit 代码托管平台。流程如下首先登录 AtomGit点击页面右上角的 号创建新仓库仓库名称填写 student-api需符合标识符命名规范。创建完成后进入 个人设置 → 访问令牌 → 新建访问令牌勾选 repo 权限生成并保存令牌密钥。然后在终端执行bashgit initgit add .git commit -m “feat: 学生信息管理API初始版本”git remote add origin https://atomgit.com/LSCC/student-api.gitgit push -u origin main首次推送时输入用户名和令牌密钥即可。需要注意令牌密钥只在创建时显示一次务必妥善保存后续拉取和提交代码都需要用它作为密码。七、总结与展望这个项目虽然代码量不大但麻雀虽小五脏俱全。它完整地跑通了“数据建模 → 存储层设计 → RESTful 接口实现 → 自动生成文档 → 接口测试”这条链路是理解后端接口开发全貌的一个极佳起点。以下几点值得特别回顾第一FastAPI 用最少的样板代码把“定义接口”和“写文档”这两件事合二为一类型注解既是校验规则也是文档来源。第二内存存储虽然简单但配合线程锁和自增 ID 的设计已经具备了存储层的基本形态未来替换为真实数据库时接口层无需改动。第三即便在小型项目中分层设计依然有其价值——它让代码的职责边界清晰为后续扩展保留了平滑的演进路径。如果要将这个项目进一步扩展可以从以下方向入手接入 SQLite 或 MySQL 实现数据持久化增加 JWT 用户认证添加分页参数用 Docker 容器化部署到云服务器。这些都将在真实的生产场景中派上用场。项目仓库地址https://atomgit.com/LSCC/student-api作业信息学号48052402036姓名罗思畅班级24大数据2班