FastAPI — 타입이 곧 계약이다 · 계약과 수명 · 实验
새는 필드와 멈추는 루프
目标
亲手制造并修复 FastAPI 在实际工作中最常出现的两类问题。
- 响应中泄露敏感字段(第 3 → 4 步)
async def中的阻塞导致整个服务器停顿(第 7 步)
规则
- 所有文件都在
/root/work/api中创建。 - 应用实例的名称必须是
app,存储库依赖项的名称必须是get_store。 - 评分程序会直接导入你的
app.py并向其发送请求。
评分程序会使用这些名称导入它们。
即使 uvicorn 没有运行也能评分(第 1 步除外——该步骤必须实际启动服务器)。
启动服务器
cd /root/work/apiuvicorn app:app --host 0.0.0.0 --port 8000 > /tmp/uv.log 2>&1 &curl -s localhost:8000/healthz请勿使用 --reload。修改文件后,先执行 kill %1 再重新启动,
这样可以明确知道当前运行的是什么。
步骤
1. /healthz → 01-healthz.txt
2. Pydantic 验证、422 → 02-422.json
3. 故意泄露 → 03-leak.json
4. 使用 response_model 阻止泄露
5. HTTPException 404
6. Depends(get_store)
7. async def vs def → 07-block.txt · 07-unblock.txt
8. dependency_overrides 测试
9. 总结 → 09-notes.md
参考
不要手写验证代码。如果你正在使用 if not isinstance(...),
就说明你抢走了类型提示本应完成的工作。
9个步骤
- 启动服务器
- 拒绝无效输入
- 故意泄露敏感字段
- 使用输出模型阻止泄露
- 对不存在的资源返回 404
- 通过依赖项注入存储库
- 让事件循环停顿,然后修复它
- 替换依赖项进行测试
- 总结这两类事故