Python 现代开发学习笔记

(一)从书架操作到接口项目

上一章保存一本书,需要自己解析路径、选择动作、读取 JSON,再调用校验函数。现在保留同样的操作,把这些重复工作交给 FastAPI。我们先观察一条请求怎样进入函数,再接上数据库、账号和权限。

这章的书籍仍有书名、已读状态和标签。每个人只管理自己的书;新增之后可以查询、修改、删除,也可以按书名和状态筛选。关闭服务后,账号、登录令牌和书籍保存在 SQLite 文件中,重新启动可以继续读取。

1. 阅读顺序与配套目录

先读(二)至(六),用短程序观察路径、查询字段、请求体和模型结果;再读(七)至(十三),把表、事务、依赖、身份与归属连起来。(十四)至(十九)组合完整 API,并加入错误响应与后台导出。最后运行项目,跟着实际请求和测试复盘。

配套目录见 FastAPI 示例索引。完整项目在 api_project,demos 放独立的小例。标明“续写同一文件”的代码依次接在对应文件后面;下载的项目已经组合好。

2. 准备项目环境

进入 Python现代开发示例/FastAPI/api_project。FastAPI 负责 Web 参数与路由,Pydantic 负责数据模型,SQLAlchemy 负责数据库映射和会话,Uvicorn 负责接收 HTTP 并调用 ASGI 应用。Werkzeug 沿用上一章的密码摘要;HTTPX 和 pytest 用来发送请求与检查结果。

# 项目文件:api_project/pyproject.toml
# 声明 API、校验与数据库依赖,把接口静态资源一同装入 wheel。
[build-system]
requires = ["setuptools>=80"]
build-backend = "setuptools.build_meta"

[project]
name = "reading-books-api"
version = "0.1.0"
description = "Python 3.12 学习笔记的持久化书籍 API"
requires-python = ">=3.12,<3.13"
dependencies = [
    "fastapi>=0.121,<1",
    "pydantic>=2.12,<3",
    "sqlalchemy>=2.0,<2.1",
    "uvicorn>=0.35,<1",
    "werkzeug>=3.1,<4",
    "httpx>=0.28,<1",
]

[dependency-groups]
dev = ["pytest>=9.1,<10"]

[project.scripts]
api-books = "bookapi.cli:main"

[tool.setuptools.packages.find]
where = ["src"]

[tool.pytest.ini_options]
testpaths = ["tests"]

fastapi 和 pydantic 都在这里声明,因为项目会直接导入它们;依赖的精确版本记录在 uv.lock。sqlalchemy 使用 2.0 系列的 select、Mapped 和 Session 写法,Pydantic 使用第二版的 model_validate、model_dump 和校验器。

# uv:按项目锁定文件创建或同步 Python 3.12 环境。
uv sync --locked
# 确认运行的是这个项目的解释器。
uv run python --version

使用 pip + venv 时,在同一项目目录执行下面的命令。pip-requirements.txt 与项目锁定结果对应,包含运行和测试依赖。

# Windows:创建项目环境,再用它自己的解释器安装。
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r pip-requirements.txt
.\.venv\Scripts\python.exe -m pip install --no-deps -e .

用 pip 路线运行后面的命令时,把 uv run python 换成 .\.venv\Scripts\python.exe;uv run api-books serve 对应 .\.venv\Scripts\api-books.exe serve。VS Code 选择项目 .venv,方法沿用第一章。

笔记正文与全部题解 · Ctrl / ⌘ K