👉 项目官网:https://www.python-office.com/ 👈
👉 本开源项目的交流群 👈
大家好,这里是程序员晚枫,全网同名。
(4 h 直播 / 录播可拆 2×2 h)
目标
• 把元类、描述符、异步上下文管理器、数据类全部串烧
• 实现「路由 + 中间件 + 异步视图 + 自动 Swagger」的完整闭环
• 最终产出可 pip install
的框架包,并在启动 banner 植入「程序员晚枫」彩蛋
──────────────────
10.0 开场 3 min
“今天不写业务,而是写‘能写业务的工具’;300 行代码,跑出一个 FastAPI 的 80 % 能力。”
──────────────────
10.1 需求澄清(5 min)
| 功能 | 技术点 |
|————–|——————————–|
| 路由 | 元类自动注册 |
| 依赖注入 | 描述符 + 数据类 |
| 中间件 | 异步上下文管理器 |
| 文档 | dataclass → JSON Schema → Swagger |
| CLI | typer 一键启动 |
──────────────────
10.2 项目骨架 10 min
1 | miniweb/ |
──────────────────
10.3 路由元类 25 min
1 | from miniweb.routing import RouterMeta |
实现 RouterMeta
:
1 | class RouterMeta(type): |
装饰器语法糖:
1 | from functools import wraps |
──────────────────
10.4 异步视图 + 依赖注入 30 min
1 | from dataclasses import dataclass |
依赖注入实现:
1 | from inspect import signature |
──────────────────
10.5 洋葱中间件 25 min
1 | from contextlib import asynccontextmanager |
注册方式:
1 | app.use(cors_middleware) |
──────────────────
10.6 数据类 → Swagger 自动生成 20 min
1 | from miniweb.schema import schema_from_dataclass |
实现:
1 | from typing import get_type_hints, get_origin, get_args |
──────────────────
10.7 CLI 启动 & 彩蛋 Banner 15 min
1 | import typer, uvicorn, textwrap |
──────────────────
10.8 打包 & 发布 10 min
1 | poetry build |
──────────────────
10.9 单元测试 & 基准 15 min
1 | import pytest, httpx, asyncio |
──────────────────
10.10 一键脚手架 10 min
1 | pip install miniweb |
──────────────────
10.11 小结 & 彩蛋彩蛋(5 min)
300 行代码 ≈ FastAPI 20 % 功能,但 100 % 覆盖了课程所有知识点。
──────────────────
10.12 终极作业
- 必做:给框架加
@cache
装饰器,底层用functools.lru_cache
,并在缓存命中时打印「程序员晚枫的缓存命中 +1」。 - 选做:支持 WebSocket 路由
/ws
,使用anyio
兼容 trio/asyncio。 - 彩蛋:启动时随机输出 3 条「程序员晚枫」段子,来自内置 JSON。
提交:
• 仓库 fork 至 feat/lesson10
• CI 通过后自动打 tag v1.0.0
并发 Tweet:
“🎉 MiniWeb 1.0 发布!300 行代码带你飞,感谢 程序员晚枫 全程陪跑。”
(课程完结 🎉)
大家在学习课程中有任何问题,欢迎+微信和我交流👉我的联系方式:微信、读者群、1对1、福利