FastAPI 是一个现代、高性能的 Web 框架,用于构建 API。它的核心设计理念可以概括为:基于标准 Python 类型提示、自动数据验证、自动生成文档以及极高的性能。
以下是 FastAPI 的 7 大核心概念,掌握它们你就掌握了 FastAPI 的精髓:
1. Python 类型提示 (Type Hints)
这是 FastAPI 的基石。FastAPI 利用 Python 3.6+ 的标准类型提示来推断数据的类型、验证规则和文档描述。
- 以前:你需要手动解析请求体、检查类型、编写文档。
- 现在:你只需声明变量类型,FastAPI 自动处理其余所有事情。
# 这里的 str, int, bool 都是标准的 Python 类型提示
def get_item(item_id: int, q: str | None = None):
...2. Pydantic 模型 (数据验证与序列化)
FastAPI 深度集成 Pydantic。当你定义一个继承自 BaseModel 的类时,它不仅仅是一个数据结构,还是一个强大的验证器。
- 自动验证:如果传入的数据类型不对(如字符串传给 int),FastAPI 会自动返回清晰的 422 错误。
- 自动序列化:返回 Pydantic 模型时,FastAPI 会自动将其转换为 JSON。
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
is_offer: bool | None = None # 可选字段3. 依赖注入系统 (Dependency Injection)
这是 FastAPI 最强大、最独特的特性(我们之前详细讨论过)。它允许你声明代码所需的“依赖”,FastAPI 负责解析和执行。
- 用途:数据库连接、当前用户认证、权限检查、共享逻辑等。
- 优势:代码解耦、易于测试、自动处理资源清理(使用
yield)。
from fastapi import Depends
def get_current_user(token: str = Depends(oauth2_scheme)):
return user
@app.get("/users/me")
def read_users_me(current_user: User = Depends(get_current_user)):
return current_user4. 路径操作装饰器 (Path Operations)
FastAPI 使用标准的 HTTP 方法作为装饰器来定义 API 端点。
@app.get()@app.post()@app.put()@app.delete()@app.patch()
每个装饰器对应一个 URL 路径和 HTTP 动词,清晰直观。
5. 参数来源的明确区分
FastAPI 能够智能地区分数据来自哪里,你只需要通过特定的类来声明:
| 数据来源 | 声明方式 | 示例 |
|---|---|---|
| 路径参数 | 直接在函数参数中声明 | /items/{item_id} -> item_id: int |
| 查询参数 | 默认行为,或使用 Query | /items/?skip=0 -> skip: int = Query(0) |
| 请求体 (JSON) | 使用 Pydantic 模型或 Body | item: Item |
| 表单数据 | 使用 Form | username: str = Form() |
| 文件上传 | 使用 File / UploadFile | file: UploadFile = File() |
| Header/Cookie | 使用 Header / Cookie | user_agent: str = Header() |
6. 自动交互式文档 (Swagger UI & ReDoc)
因为你使用了类型提示和 Pydantic 模型,FastAPI 可以实时生成符合 OpenAPI 标准的 API 文档。
- Swagger UI:访问
/docs,你可以直接在此页面测试你的 API,无需 Postman。 - ReDoc:访问
/redoc,提供更美观、适合阅读的文档视图。
这意味着你不再需要手动维护 API 文档,代码即文档。
7. 异步支持 (Async/Await)
FastAPI 基于 Starlette 构建,原生支持 ASGI(异步服务器网关接口)。
- 高并发:你可以使用
async def定义路径操作函数,从而在处理 I/O 密集型任务(如数据库查询、HTTP 请求)时实现高并发。 - 兼容性:如果你不使用
async,FastAPI 也会在线程池中运行同步函数,保证不会阻塞事件循环。
# 异步路径操作
@app.get("/items/")
async def read_items():
results = await database.fetch_all(query)
return results总结:FastAPI 的工作流
- 定义模型:用 Pydantic 定义数据结构。
- 声明依赖:用
Depends定义通用逻辑(如鉴权)。 - 编写路径操作:用
@app.get/post...定义端点,使用类型提示声明参数。 - 自动魔法:FastAPI 自动处理:
- 读取请求数据
- 数据转换与验证
- 依赖注入执行
- 调用你的函数
- 响应数据序列化
- 生成 OpenAPI 文档
这就是为什么 FastAPI 开发速度极快且bug较少的原因。你想深入了解其中哪个具体概念吗?比如 Pydantic V2 的新特性 或者 如何设计大型项目的目录结构?