FastAPI 教程

FastAPI 核心概念

FastAPI 是一个现代、高性能的 Web 框架,用于构建 API。它的核心设计理念可以概括为:基于标准 Python 类型提示自动数据验证自动生成文档以及极高的性能

以下是 FastAPI 的 7 大核心概念,掌握它们你就掌握了 FastAPI 的精髓:


1. Python 类型提示 (Type Hints)

这是 FastAPI 的基石。FastAPI 利用 Python 3.6+ 的标准类型提示来推断数据的类型、验证规则和文档描述。

  • 以前:你需要手动解析请求体、检查类型、编写文档。
  • 现在:你只需声明变量类型,FastAPI 自动处理其余所有事情。
纯文本
plaintext
# 这里的 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。
纯文本
plaintext
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    is_offer: bool | None = None # 可选字段

3. 依赖注入系统 (Dependency Injection)

这是 FastAPI 最强大、最独特的特性(我们之前详细讨论过)。它允许你声明代码所需的“依赖”,FastAPI 负责解析和执行。

  • 用途:数据库连接、当前用户认证、权限检查、共享逻辑等。
  • 优势:代码解耦、易于测试、自动处理资源清理(使用 yield)。
纯文本
plaintext
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_user

4. 路径操作装饰器 (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 模型或 Bodyitem: Item
表单数据使用 Formusername: str = Form()
文件上传使用 File / UploadFilefile: UploadFile = File()
Header/Cookie使用 Header / Cookieuser_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 也会在线程池中运行同步函数,保证不会阻塞事件循环。
纯文本
plaintext
# 异步路径操作
@app.get("/items/")
async def read_items():
    results = await database.fetch_all(query)
    return results

总结:FastAPI 的工作流

  1. 定义模型:用 Pydantic 定义数据结构。
  2. 声明依赖:用 Depends 定义通用逻辑(如鉴权)。
  3. 编写路径操作:用 @app.get/post... 定义端点,使用类型提示声明参数。
  4. 自动魔法:FastAPI 自动处理:
    • 读取请求数据
    • 数据转换与验证
    • 依赖注入执行
    • 调用你的函数
    • 响应数据序列化
    • 生成 OpenAPI 文档

这就是为什么 FastAPI 开发速度极快且bug较少的原因。你想深入了解其中哪个具体概念吗?比如 Pydantic V2 的新特性 或者 如何设计大型项目的目录结构

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注