(一)从浏览器保存一本书
1. 启动已有数据的书架
进入配套 web_project,用 Python 3.12 建立环境。SQLite、HTTP 服务入口与数据解析使用标准库;Werkzeug 提供密码摘要工具,HTTPX 运行请求演示,Uvicorn 在后半章接收 ASGI 应用。
# 项目文件:web_project/pyproject.toml
# Werkzeug提供密码摘要工具,HTTPX运行请求演示,Uvicorn承接ASGI小例。
[build-system]
requires = ["setuptools>=80,<83"]
build-backend = "setuptools.build_meta"
[project]
name = "reading-web-foundations"
version = "0.1.0"
requires-python = ">=3.12,<3.13"
dependencies = ["Werkzeug>=3.1,<4", "httpx>=0.28,<1", "uvicorn>=0.35,<1"]
[project.scripts]
web-books = "webbook.cli:main"
[dependency-groups]
dev = ["pytest>=9.1,<10"]
[tool.setuptools.packages.find]
where = ["src"]
[tool.setuptools.package-data]
webbook = ["templates/*.html", "static/*.css", "static/*.js"]
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-ra --import-mode=importlib"# 在 web_project 中建立环境,将前面采集的六本书交给alice。
uv sync --locked
uv run web-books init --db data/library.sqlite3 --csv data/books.csv
# 打开终端提示的地址,浏览器访问 http://127.0.0.1:8767。
uv run web-books serve --db data/library.sqlite3
pip 路线使用 Python 3.12 的 .venv,执行 python -m pip install -e . -r requirements-dev.txt 后,以 python -m webbook init、python -m webbook serve 启动相同流程。
打开页面后,用演示账号 alice / learn-alice 登录,看到第九章采集的六本书。输入“Python Web 实践”,标签填“Python,网络”,保持未读并保存。再次刷新,记录仍在;点击“标记已读”,它的状态会改变。
2. 先固定任务中的数据与动作
自拟任务:多人阅读书架。 每个账号保存自己的书籍,书名为 1–100 个字符,同账号不重复保存同名书;标签至多 10 项,每项为 1–30 个字符。页面表单与 JSON API 共用这些规则,书籍请求体最多 16384 字节。
| 动作 | 浏览器或客户端发送 | 服务器完成后交回 |
|---|---|---|
| 查看书架 | GET / |
当前账号的 HTML 页面 |
| 保存表单 | POST /books |
保存后跳转回书架 |
| 读取数据 | GET /api/books |
JSON 列表 |
| 新增 JSON | POST /api/books |
新记录及其查询地址 |
| 标记已读 | POST /api/books/编号/finish |
更新后的记录 |
alice 的书不会出现在 bob 的列表中,修改操作也会在服务器核对记录归属。下面逐步构建这些行为。