FastApi-基础准备
代码结构
fastapi/
📁 顶层目录 fastapi/
├── __init__.py # 统一导出公共 API(FastAPI、APIRouter、Depends 等)
├── applications.py # FastAPI 主应用类,继承 Starlette
├── routing.py # APIRouter 与路由匹配、请求处理链核心
├── param_functions.py # Query、Path、Body 等快捷工厂函数
├── params.py # 所有参数模型基类(Param、Depends、Security 等)
├── dependencies/
│ ├── __init__.py # 导出 Depends
│ └── utils.py # 依赖解析、缓存、生成器关闭等底层实现
│ └── models.py # 定义模型相关
├── exceptions.py # FastAPI 自定义异常(如 RequestValidationError)
├── encoders.py # Pydantic 模型 → JSON 的序列化/编码器
├── openapi/
│ ├── __init__.py # 导出 get_openapi
│ ├── models.py # OpenAPI 3.x Pydantic 对象模型
│ └── utils.py # 生成 operationId、标签、示例等辅助函数
├── security/
│ ├── __init__.py # 导出 HTTPBearer、OAuth2PasswordBearer 等
│ ├── base.py # 安全基类
│ ├── http.py # HTTP Basic / Bearer 实现
│ ├── oauth2.py # OAuth2 Password / Authorization Code 实现
│ └── open_id_connect_url.py # OpenID Connect 发现 URL 支持
├── middleware/
│ ├── __init__.py # 统一导出官方中间件
│ ├── cors.py # CORS 跨域中间件
│ ├── gzip.py # GZip 压缩中间件
│ └── httpsredirect.py # HTTP → HTTPS 跳转中间件
├── background.py # BackgroundTasks 后台任务
├── responses.py # 扩展的 Response 类(JSONResponse、RedirectResponse 等)
├── websockets.py # WebSocket 路由支持
├── utils.py # 杂项工具(生成唯一 ID、深拷贝 Pydantic 模型等)
├── types.py # 类型别名(Decorator、ASGIApp 等)
├── main.py # CLI 入口:fastapi dev / run
├── cli.py # Typer 命令行定义:dev、run、docs 子命令
└── logger.py # 日志配置
核心架构分析
整体架构层次
- ASGI 应用层
- 路由处理层
- 依赖注入系统
- 数据验证和序列化层
主要模块结构
fastapi/__init__.py
: 主要导出和版本fastapi/applications.py
: FastAPI 核心类fastapi/routing.py
: 路由系统fastapi/dependencies
: 依赖注入系统fastapi/param_functions.py
: 参数处理函数
核心组件深入
FastAPI 类 (applications.py)
- 继承自 Starlette 的扩展
- 路由注册机制
- 中间件处理流程
- 异常处理系统
路由系统 (routing.py)
- APIRoute 类实现
- 请求处理流程
- 路径参数和查询参数处理
- 请求体和响应体处理
依赖注入系统
- Depends 机制实现
- 依赖缓存处理
- 子依赖解析
数据验证和序列化
- 与 Pydantic 的集成
- 请求数据验证流程
- 响应数据序列化
请求生命周期分析
请求处理完整流程
- 接收连接
- ASGI 服务器(uvicorn、hypercorn 等)先建立 TCP/HTTP 或 WebSocket 连接。
- 把原始字节流封装成 ASGI scope、receive、send 三元组,交给 Starlette 的 Router。
- 中间件洋葱模型
- Starlette 按注册顺序从外到里执行中间件栈:CORS → GZip → HTTPSRedirect → TrustedHost → … → 用户自定义中间件。
- 中间件既可以短路(提前响应),也可以继续 await call_next(request) 进入下一层。
- 路由匹配
- Starlette Router 根据 scope["path"] + scope["method"] 匹配 FastAPI 生成的 APIRoute。
- 匹配成功时,FastAPI 把路径参数、查询参数、请求体等映射到 依赖注入系统 的解析树。
- 依赖注入解析(FastAPI 特有)
- 递归解析 Depends() 依赖,生成一个有向无环图。
- 先执行同步依赖,再执行异步依赖;共享依赖只会实例化一次(缓存)。
- 如果依赖里出现数据库连接、身份验证等,就在这里完成。
- 参数校验 & 反序列化
- 用 Pydantic 根据函数签名生成模型,对查询、路径、请求体字段做类型校验。
- 校验失败立即返回 422 结构化错误 JSON。
- 调用端点函数
- 调用用户定义的 async def 或普通 def 函数。
- 如果是同步函数,FastAPI 会把它放到线程池执行,避免阻塞事件循环。
- 返回值的序列化
- 根据响应模型(response_model)再次用 Pydantic 序列化。
- 支持 ORM 模型、列表、字典、BaseModel、字典嵌套等。
- 自动设置 Content-Type: application/json(除非显式返回 Response)。
- 后台任务(可选)
- 如果端点里 background_tasks.add_task(...),Starlette 在响应已发送后执行这些任务。
- 任务失败不会回滚已返回的 HTTP 响应。
- 中间件洋葱出栈
- 中间件按 相反顺序 执行剩余逻辑(例如设置 Cookie、添加额外响应头)。
- ASGI 服务器发送响应
- Starlette 把最终的 Response 转换成 ASGI send 消息,由服务器写回客户端。
sequenceDiagram
participant Client as 客户端
participant ASGI as ASGI服务器
participant Exception as 全局异常处理
participant Middleware as 中间件栈
participant Router as 路由器
participant Dependencies as 依赖注入
participant Security as 安全依赖
participant Endpoint as 端点函数
participant Pydantic as 数据验证
participant Background as 后台任务
Client->>ASGI: HTTP请求
ASGI->>Exception: 进入异常处理上下文
Exception->>Middleware: 调用中间件链
loop 中间件(请求阶段)
Middleware->>Middleware: 例如: CORS、HTTPS重定向等
end
alt 路由匹配失败
Middleware--xException: 触发HTTPException(404)
else 匹配成功
Middleware->>Router: 路由到APIRoute
Router->>Dependencies: 解析显式依赖项
Dependencies->>Security: 执行安全依赖(如OAuth2)
Security->>Pydantic: 验证安全凭证
Dependencies->>Pydantic: 验证路径/查询参数
Dependencies->>Pydantic: 验证请求体(如有)
Pydantic->>Endpoint: 转换后的参数输入
Endpoint->>Background: 注册后台任务(如有)
Endpoint->>Pydantic: 响应数据验证
Pydantic->>Router: 序列化响应
end
alt 发生异常
Exception->>Middleware: 异常转换响应
end
loop 中间件(响应阶段)
Middleware->>MiddleWare: 处理响应(如添加头部)
end
Middleware->>ASGI: 最终响应
ASGI->>Client: 返回HTTP响应
异常处理流程
- 任何阶段抛出的异常会被捕获并转换为适当的 HTTP 响应
- 可通过
@app.exception_handler
自定义异常处理
参考文档:
← Previous postPython中的多线程编程
Next post →FastApi框架源码赏析-核心应用模块