Skip to main content
复盘日:恭喜你完成了第三周的学习!今天是巩固和总结的日子。我们将回顾过去 6 天学到的所有 FastAPI 知识,整理成速查表,并记录遇到的问题和解决方案。今天不只是复习,而是要彻底理解 “如何将 FastAPI 知识应用到实际项目”“如何设计可扩展的 API 架构” 以及 “如何为下一阶段的 Go 语言学习做好准备”

复盘内容 | Review

Day 15 - 快速入门
  • FastAPI 应用初始化:app = FastAPI(title="...", description="...")
  • 路由定义:@app.get("/")@app.post("/")
  • 路径参数:@app.get("/items/{item_id}")item_id: int 自动类型转换
  • 查询参数:函数参数不在路径中,自动识别为查询参数
  • Uvicorn 启动:uvicorn main:app --reload
  • Swagger UI:自动生成文档,访问 /docs
Day 16 - Pydantic 数据验证
  • Schema 定义:继承 BaseModel,使用类型提示
  • Field 验证:Field(..., min_length=3, max_length=20)
  • 请求模型:定义前端发送的数据结构
  • 响应模型:response_model=UserResponse 自动过滤字段
  • EmailStr:自动验证邮箱格式(需要安装 email-validator)
  • 特殊类型:IPvAnyAddressHttpUrldatetime
Day 17 - 依赖注入与中间件
  • 依赖注入:Depends(verify_token) 复用逻辑
  • 依赖返回值:current_user: dict = Depends(get_current_user)
  • 中间件:@app.middleware("http") 全局处理
  • CORS 配置:CORSMiddleware 处理跨域请求
  • 请求耗时:中间件统计处理时间
Day 18 - 数据库整合
  • 异步引擎:create_async_engine(DATABASE_URL)
  • 异步会话:AsyncSessionAsyncSessionLocal
  • 模型定义:继承 Base,使用 Column 定义字段
  • 查询语法:select(Model).where(...).offset(...).limit(...)
  • 数据库依赖:async def get_db(): yield session
  • 事务控制:await db.commit()await db.rollback()
Day 19 - 生产部署
  • 配置管理:pydantic-settings 读取环境变量
  • .env 文件:存储敏感配置(不提交到 Git)
  • Gunicorn:进程管理器,管理多个 Uvicorn Worker
  • Dockerfile:容器化应用
  • Docker Compose:编排多个服务
Day 20 - 综合实战
  • 项目结构:模块化设计,按功能拆分
  • 完整 CRUD:创建、查询、更新、删除
  • 数据验证:Pydantic 自动验证请求数据
  • 容器化部署:Docker + Docker Compose

复盘产出 | Output

1. 第三阶段速查表

FastAPI 基础

from fastapi import FastAPI

app = FastAPI(title="My API")

@app.get("/")
def read_root():
    return {"message": "Hello"}

# 启动: uvicorn main:app --reload

Pydantic 模型

from pydantic import BaseModel, Field

class UserCreate(BaseModel):
    username: str = Field(..., min_length=3)
    email: EmailStr

@app.post("/users/", response_model=UserResponse)
def create_user(user: UserCreate):
    return user

依赖注入

from fastapi import Depends

async def get_db():
    async with AsyncSessionLocal() as session:
        yield session

@app.get("/items/", dependencies=[Depends(verify_token)])
def read_items(db: AsyncSession = Depends(get_db)):
    return []

数据库操作

from sqlalchemy.future import select

result = await db.execute(select(User))
users = result.scalars().all()

db.add(new_user)
await db.commit()

配置管理

from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    database_url: str
    class Config:
        env_file = ".env"

settings = Settings()

Docker 部署

FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "app.main:app", "-w", "4", "-k", "uvicorn.workers.UvicornWorker"]

2. 常见问题与解决方案

问题422 Validation Error解决方案
  • 检查请求数据是否符合 Schema 定义
  • 检查字段类型是否正确
  • 检查必填字段是否提供
问题:路由不生效解决方案
  • 检查路由装饰器是否正确(@app.get("/")
  • 检查函数名是否重复
  • 检查服务器是否重启(开发模式需要 --reload
问题RuntimeError: This event loop is already running解决方案:检查代码中是否有同步调用,确保所有数据库操作都是异步的问题:连接泄漏解决方案:确保使用依赖注入管理会话,或使用 async with 确保会话关闭
问题:Docker 构建失败解决方案
  • 检查 Dockerfile 语法
  • 检查 requirements.txt 是否存在
  • 检查依赖是否正确安装
问题:容器启动后立即退出解决方案
  • 检查启动命令是否正确
  • 检查日志:docker logs container_name
  • 检查环境变量是否正确配置

3. 项目重构示例

原始版本
@app.get("/items/{item_id}")
def read_item(item_id: int):
    return {"item_id": item_id}
优化版本(应用 Week 3 学到的知识):
from pydantic import BaseModel
from sqlalchemy.ext.asyncio import AsyncSession
from fastapi import Depends, HTTPException

class ItemResponse(BaseModel):
    id: int
    name: str
    class Config:
        from_attributes = True

@app.get("/items/{item_id}", response_model=ItemResponse)
async def read_item(
    item_id: int,
    db: AsyncSession = Depends(get_db)
):
    result = await db.execute(select(Item).where(Item.id == item_id))
    item = result.scalars().first()
    if not item:
        raise HTTPException(404, "Item not found")
    return item
改进点
  • 使用异步数据库操作
  • 添加响应模型,自动序列化
  • 使用依赖注入管理数据库会话
  • 添加错误处理

🏆 阶段性总结

恭喜你!你已经完成了 Project Team 基础训练营的第三阶段。
到这里你已经掌握了:
  • ✅ FastAPI 框架基础和路由定义
  • ✅ Pydantic 数据验证和模型设计
  • ✅ 依赖注入和中间件
  • ✅ SQLAlchemy 异步数据库操作
  • ✅ 配置管理和环境变量
  • ✅ Docker 容器化部署
  • ✅ 完整的 API 项目开发能力
下一阶段(Week 4)将学习:
  • Go 语言基础
  • Go 并发编程
  • Go Web 开发
  • 微服务架构

学习建议

巩固基础

  • 复习本周的所有代码示例
  • 完成所有拓展任务
  • 整理个人知识库和速查表
  • 记录遇到的问题和解决方案

实践项目

  • 尝试开发自己的 API 项目
  • 练习数据库操作和依赖注入
  • 熟悉 Docker 部署流程
  • 研究生产环境的最佳实践

上一天: 综合实战

Day 20 | 第三阶段综合实战

下一周: Go 语言

第 04 周 | Go 语言拓展