目录

一、认识 FastAPI

1. 什么是 FastAPI

2. 系统架构与应用定位

二、RESTful API 与 FastAPI

1. 什么是 API

2. 什么是 RESTful API

三、为什么选择 FastAPI

1. FastAPI 的主要特点

2. FastAPI 技术栈组成

3. 常见框架对比

四、第一个 FastAPI 应用

1. 代码实例

2. 应用启动与请求生命周期

五、FastAPI 如何识别参数

1. 路径参数

2. 查询参数

3. 请求体

4. 默认识别规则

六、交互式 API 文档

1. 自动文档生成机制

2. API 文档测试流程

七、自定义 API 文档

1. 文档信息配置

2. 路由信息配置与 Tags 分组

3. 禁用与关闭 API 文档

总结


一、认识 FastAPI

在现代 Web 应用与服务端架构中,构建高效、类型安全且易于维护的 API 接口是后端开发的核心需求之一。本章节将对 FastAPI 进行基础定位,并从系统架构与应用场景两个维度对其展开说明


1. 什么是 FastAPI

FastAPI 是一个用于构建 API 的现代、高性能 Python Web 框架。它基于标准的 Python 类型提示,并在底层集成了 Starlette(负责 Web 处理与 ASGI 异步能力)与 Pydantic(负责数据校验与序列化)

FastAPI 具备以下特征:

  • 高性能:借助 ASGI 架构与异步处理机制,提供接近 Go 与 Node.js 的执行效率

  • 类型安全:全面基于 Python 3.8+ 的类型提示系统,提升代码自动补全能力并降低运行时错误

  • 自动文档化:基于 OpenAPI 规范,无需额外配置即可自动生成交互式 API 文档

  • 数据校验:基于 Pydantic 实现对请求体与路由参数的自动解析与校验


2. 系统架构与应用定位

在标准的分布式或单体 Web 系统中,FastAPI 充当服务端 API 层(接口呈现层)。它负责接收来自多种客户端的 HTTP 请求,解析并校验数据后交由内部业务逻辑层进行处理,最终返回结构化的 HTTP 响应(通常为 JSON 格式)

在整体系统中的位置如下所示:

在 AI 与 Agent 应用中的定位

随着大语言模型与智能体的演进,FastAPI 已成为 AI 后端服务开发中的主流选择之一

在整合 LangChain 等大模型开发框架时,FastAPI 通常作为对外统一的服务接口层。它将内部复杂的链式调用、向量数据库检索和模型推理封装为标准 RESTful 接口,供上层应用调用

典型的 AI 应用调用如下:

AI Application
      ↓
   FastAPI
      ↓
LangChain Agent
      ↓
   Database

在此架构中,FastAPI 能够为高延迟的 LLM 异步推理过程提供优秀的并发支持,同时通过严格的类型校验确保智能体输入输出数据的结构化与稳定性

二、RESTful API 与 FastAPI

在深入学习 FastAPI 的路由配置与参数解析之前,需要明确 API 以及 RESTful 架构风格的基本定义与设计思想。合理的 API 设计能够保证接口在命名与操作上的规范性


1. 什么是 API

API 是不同软件系统之间进行数据交换与调用的标准化契约

在 Web 架构体系中,API 规定了客户端(如浏览器、移动终端或其他后道服务)向服务端发起数据请求的路径、参数格式,以及服务端所返回数据的具体格式

基础的数据通信流程如下所示:

Client
   │
   │ Request
   ▼
  API
   │
   ▼
Server
   │
   │ Response
   ▼
Client

2. 什么是 RESTful API

REST 是一种针对分布式超媒体系统的软件架构风格。遵循 REST 原则设计的 Web API 即称为 RESTful API

RESTful API 的核心设计准则强调将系统中的数据与功能抽象为资源,并通过标准的 HTTP 请求方法表达对该资源所执行的具体操作

核心设计规则

  1. 统一的资源标识:URL 路径应仅用于指定资源的位置与实体,使用复数名词表示,不应在路径中包含动作名称(例如使用 /users,而非 /getUser 或 /deleteUser)

  2. HTTP 请求方法表示操作:利用 HTTP 协议内置的操作方法指定对资源的操作行为(增加、删除、查询、修改)

常用 HTTP 方法与资源映射示例

以用户资源(users)为例,标准的 RESTful 接口定义及其对应的语义如下表所示:

HTTP 方法URL 路径语义说明
GET/users查询用户列表
GET/users/1001查询 ID 为 1001 的特定用户详情
POST/users创建一个新用户
PUT/users/1001修改 / 更新 ID 为 1001 的用户信息
DELETE/users/1001删除 ID 为 1001 的特定用户
  1. GET:只读操作,不修改服务端资源,可缓存

  2. POST:提交资源,通常用于新增,资源标识由服务端生成

  3. PUT:全量替换指定资源,要求客户端提供完整资源数据;若资源不存在,部分实现会新建

  4. DELETE:移除指定资源

这种规范化的设计方式使 API 具有极高的可读性。在后续的 FastAPI 开发中,路由装饰器(如 @app.get()、@app.post())正是直接与此设计模型相对应

三、为什么选择 FastAPI

在 Python 后端开发生态中,选择合适的框架对于项目的开发效率、代码可维护性以及后续的扩展能力至关重要。本章将拆解 FastAPI 的主要技术特点、技术栈构成,并将其与传统框架进行对比


1. FastAPI 的主要特点

FastAPI 整合了现代化 Python 开发的核心特性,其主要技术优势体现在以下几个方面:

  • 类型提示:全面基于 Python 标准类型声明,赋予 IDE 强大的代码自动补全与静态检查能力

  • Pydantic 数据验证:自动化完成请求数据的类型转换、严格校验与 JSON 序列化

  • Starlette 支撑:继承 Starlette 的原生 ASGI 架构与异步高并发处理能力

  • 自动参数解析:根据函数签名自动识别并提取 Path、Query 以及 Request Body 等不同来源的数据

  • OpenAPI 规范生成:无需额外手动编写文档,直接根据代码定义生成标准的交互式 API 文档


2. FastAPI 技术栈组成

FastAPI 的设计哲学是 "站在巨人的肩膀上",通过组合 Python 生态中成熟的工具来提供完备的 API 解决方案

其底层技术栈依赖结构如下:

  • Starlette:负责底层的 Web 路由分发、HTTP/WebSocket 协议解析、中间件管理以及 ASGI 异步事件处理

  • Pydantic:负责定义数据模型、执行严格的数据校验,并完成 Python 对象与 JSON 数据之间的相互序列化

  • 类型提示:FastAPI 的核心声明机制,通过类型注解推导请求参数、数据校验规则、依赖关系以及 API Schema


3. 常见框架对比

在 Python Web 生态中,Flask、FastAPI 与 Django 分别代表了不同的设计路线。以下为三者对比

FlaskFastAPIDjango
框架定位轻量级 Web 框架现代 API 专属框架全功能Web 框架
类型驱动较弱(依赖额外插件)强(原生依托 Type Hints)非核心设计依赖
API 文档依赖第三方扩展原生内置支持依赖第三方工具
异步处理 仅在高版本提供有限支持原生核心优势(原生基于 ASGI)现已支持异步,但历史包袱较重
内置 ORM无(通常搭 SQLAlchemy)无(灵活对接任意 ORM)内置强力 ORM
适用场景小型 Web 应用/极简 API现代微服务、RESTful API、AI 后端传统单体 Web 系统、内容管理系统

选择 FastAPI 的理由

评估是否选用 FastAPI 时,其核心考量并非单一的技术性能指标,而在于以下三点优势:

  1. 更低的数据校验成本:通过 Pydantic 自动完成复杂的入参校验,无需在业务代码中编写大量防御性数据逻辑

  2. 零成本的文档同步:代码变更即意味着 API 文档的同步更新,有效规避了 "代码与接口文档不一致" 的协同痛点

  3. 原生适应异步生态:在面对高延迟的外部接口调用、数据库 I/O 或 AI 模型推理时,原生异步支持能够提供更高的并发吞吐量

四、第一个 FastAPI 应用

在明确了框架背景与 RESTful API 的设计原则后,本章将通过编写一个最基础的示例程序,演示 FastAPI 的基本编码范式、核心构件以及底层的请求处理流程


1. 代码实例

创建一个名为 main.py 的文件,写入以下代码:

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello FastAPI"}

上述代码包含四个核心要素,其对应关系与功能定义如下:

  • 应用实例初始化 (app = FastAPI()):实例化 FastAPI 类,创建整个 Web 服务的核心主控对象。后续的路由注册、中间件挂载与文档配置均基于此对象进行

  • 路由装饰器注册 (@app.get("/")):告知框架当前函数监听的路径(/)与 HTTP 方法(GET)。在 FastAPI 中,这类装饰器被称为路径操作装饰器

  • 路径操作函数定义 (async def root()):与路由绑定的处理函数。当客户端发起匹配该路由的请求时,框架将触发执行此函数。使用 async def 可支持异步非阻塞调用

  • 数据返回与序列化 (return {"message": "Hello FastAPI"}): 函数直接返回 Python 原生数据结构。FastAPI 会自动调用 JSON 序列化器将其转换为符合标准的 JSON 字符串,并附加对应的 HTTP 报头


2. 应用启动与请求生命周期

FastAPI 本身仅作为 Web 框架,需要基于 ASGI 服务程序(如 Uvicorn)来驱动并监听网络端口

可以在终端中执行以下命令启动开发服务:

uvicorn main:app --reload
  • main:指代 Python 模块文件名(main.py)

  • app:指代代码中创建的 FastAPI() 实例变量名称

  • --reload:开启热重载模式,当检测到源码修改时自动重启服务,通常用于开发调试

运行示例:

打开浏览器访问 http://127.0.0.1:8000

客户端请求处理流程

当开发服务器启动并接收到客户端请求时,内部的处理过程分为服务初始化请求响应两个阶段:

服务初始化阶段

启动 FastAPI 应用
        ↓
   ASGI Server (Uvicorn)
        ↓
     监听指定端口
        ↓
  等待客户端 HTTP Request

HTTP 请求响应阶段(以浏览器访问 GET / 为例)

    客户端发起 GET / 请求
              ↓
         ASGI Server
              ↓
      FastAPI 路由匹配与解析
              ↓
        执行 root() 函数
              ↓
       返回值自动序列化为 JSON
              ↓
       返回 HTTP 200 Response
    

    通过这一流程,FastAPI 屏蔽了底层网络套接字处理与协议解析的复杂性,使开发者仅需关注具体的业务函数实现

    五、FastAPI 如何识别参数

    FastAPI 框架最核心的特性之一,是能够根据函数签名自动识别参数的来源位置,并完成数据提取、类型转换与验证


    1. 路径参数

    当函数参数名称与路由路径中的占位符完全匹配时,FastAPI 会将其识别为路径参数

    @app.get("/users/{user_id}")
    async def get_user(user_id: int):
        return {"user_id": user_id}
    • 识别条件:参数名 user_id 已在 URL 路径模板 /users/{user_id} 中显式声明

    • 数据来源:从 HTTP 请求 URL 的路径部分提取

    • 请求示例:GET /users/1001

    • 解析结果:字符串 "1001" 被自动转换为整数 1001 并注入到 user_id 参数中

    运行示例(以 GET /users/1001 为例


    2. 查询参数

    当函数参数为简单数据类型(如 int、str、bool 等),且出现在 URL 路径模板中时,FastAPI 会将其识别为查询参数

    @app.get("/users")
    async def list_users(
        keyword: str | None = None,
        page: int = 1
    ):
        return {"keyword": keyword, "page": page}
    • 识别条件:参数未在路径模板中声明,且类型属于简单类型。如果参数设置了默认值,则该查询参数为可选参数;若未设置默认值,则为必填查询参数

    • 数据来源:从 URL 问号后面的 Query String 中提取

    • 请求示例:GET /users?keyword=Tom&page=2

    • 解析结果:keyword 提取为 "Tom",page 提取并转换为 2

    运行示例(以 GET /users?keyword=Tom&page=2 为例)


    3. 请求体

    当函数参数的类型注解为一个继承自 pydantic.BaseModel 的数据模型时,FastAPI 会将其识别为请求体参数

    from pydantic import BaseModel
    
    class UserCreate(BaseModel):
        name: str
        age: int
    
    @app.post("/users")
    async def create_user(user: UserCreate):
        return {"status": "success", "data": user}
    • 识别条件:参数类型为 Pydantic Model(复杂的结构化对象)

    • 数据来源:从 HTTP 请求体的 JSON 数据中提取

    • 请求载荷(Payload)

    {
        "name": "Tom",
        "age": 20
    }
    • 解析流程:FastAPI 读取请求体 JSON -> Pydantic 进行字段类型验证 -> 实例化为 UserCreate 对象传递给函数

    输出示例

    注意:浏览器地址栏只能直接发起 GET 请求,参数通常通过 URL 传递,不能直接携带 JSON 请求体


    4. 默认识别规则

    在不显式声明 Path()、Query() 或 Body() 等配置函数的前提下,FastAPI 对函数参数的位置识别遵循以下判定逻辑:

                    函数参数
                      │
                      ├── 是否在 URL Path 模板中声明?
                      │       ↓ Yes
                      │     Path Parameter(路径参数)
                      │
                      ├── 是否为 Pydantic Model 类型?
                      │       ↓ Yes
                      │     Request Body(请求体)
                      │
                      └── 是否为简单数据类型 (str, int, float, bool 等)?
                              ↓ Yes
                            Query Parameter(查询参数)

    在高级用法中,开发者可以通过 Path()、Query()、Body()、Header()、Cookie() 以及 Depends() 等显式声明来重写或扩展此默认规则

    六、交互式 API 文档

    在传统的 Web 接口开发中,API 文档的编写与维护往往需要耗费大量的人力成本。FastAPI 通过原生集成 OpenAPI 规范,实现了从代码定义直接到交互式文档的自动化转换,从根本上解决了文档与代码不同步的问题


    1. 自动文档生成机制

    需要明确的是,FastAPI 本身并不直接渲染可视化 UI,而是先将代码解析并生成标准的 OpenAPI JSON Schema,然后再由前端 UI 渲染引擎将其可视化展示

    其底层工作链路与分工如下所示:

                FastAPI 代码
                       ↓
                   OpenAPI
                       ↓
             ┌─────────┴─────────┐
             ↓                   ↓
          Swagger UI           ReDoc
             ↓                   ↓
         交互式测试            API 阅读
    • OpenAPI 规范:由 OpenAPI Initiative 维护的 RESTful API 描述标准。FastAPI 默认在/openapi.json 路径下输出该标准文件

    • Swagger UI(默认路径 /docs):基于 OpenAPI 规范渲染的交互式 UI 界面,支持在浏览器端直接发起 HTTP 请求测试

    • ReDoc(默认路径 /redoc):基于 OpenAPI 规范渲染的静态 API 文档界面,排版清晰,适合作为正式的接口参考手册阅读


    2. API 文档测试流程

    启动服务后,访问 [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) 即可进入 Swagger UI 界面。利用此前定义的 GET /users/{user_id} 接口进行交互式测试的操作流程如下:

    • 选择接口:展开 GET /users/{user_id} 接口卡片

    • 开启测试:点击右上角 Try it out 按钮,使参数输入框进入可编辑状态

    • 填写参数:在 user_id 输入框中填入测试数据(例如 1001)。若定义了 Query 参数,亦可在对应字段进行填报

    • 触发请求:点击 Execute 按钮,Swagger UI 将组装标准的 HTTP 请求并发送至后台服务

    • 查看返回结果:系统在页面下方实时呈现以下四项关键信息:

      • Request URL:实际发起的完整 HTTP 请求地址

      • Response Body:服务端返回的数据

      • Response Code:HTTP 状态码

      • Response Headers:服务端返回的 HTTP 响应头信息

    七、自定义 API 文档

    为了使生成的 API 文档更具可读性并满足团队协作或生产部署的要求,FastAPI 允许开发者对自动生成的文档进行自定义配置


    1. 文档信息配置

    在初始化 FastAPI 实例时,可以通过传参定义整个 API 服务的全局元数据。这些信息将直接展示在文档页面的顶部头部区域

    app = FastAPI(
        title="User Service API",
        description="用户管理系统接口服务,提供用户注册、信息查询与状态变更功能",
        version="1.0.0"
    )

    常用参数说明:

    • title:API 文档的主标题,用于标识当前服务模块

    • description:API 服务的大体功能描述,支持 Markdown 格式文本

    • version:当前 API 的版本号,遵循语义化版本控制规范

    文档变化:


    2. 路由信息配置与 Tags 分组

    除了全局配置外,还可以在具体的路径操作装饰器(如 @app.get()、@app.post())中注入接口详细说明信息

    @app.get(
        "/users/{user_id}",
        summary="查询用户详情",
        description="根据用户唯一标识 ID 查询用户的基本信息与账号状态",
        tags=["Users"],
        response_description="成功返回用户详细数据对象",
        deprecated=False
    )
    async def get_user(user_id: int):
        return {"user_id": user_id}

    常见的路由参数定义如下:

    • summary:接口的简要说明,显示在文档列表的接口标题位置

    • description:接口的详细业务说明,展开接口详情时可见

    • tags:接口归属的分组标签列表,用于对文档按业务模块进行分类归档

    • response_description:对 HTTP 200 成功响应结果的文本说明

    • deprecated:布尔值标志位。若设为 True,文档中会将该接口标记为 "已废弃(Deprecated)",但不会阻断实际调用。

    文档变化:

    Tags 模块化分组

    当项目中的接口数量逐渐增多时,利用 Tags 参数将接口归类到对应的业务模块中,可以显著提升文档的可阅读性

    划分后的文档层级结构如下:

    API Docs
    │
    ├── Users
    │    ├── GET /users
    │    └── POST /users
    │
    ├── Books
    │    ├── GET /books
    │    └── POST /books
    │
    └── Orders
         ├── GET /orders
         └── POST /orders

    3. 禁用与关闭 API 文档

    在生产环境中,出于内部安全审计或接口保密策略的要求,通常需要禁止对外暴露交互式文档与接口结构文件

    可以通过将对应的文档 URL 参数设置为 None 来停用此功能:

    app = FastAPI(
        docs_url=None,       # 关闭 Swagger UI (/docs)
        redoc_url=None,      # 关闭 ReDoc (/redoc)
        openapi_url=None     # 关闭 OpenAPI JSON 架构文件 (/openapi.json)
    )

    确认关闭后已无法访问:

    需要指出的是,"禁用 API 文档" 仅属于隐藏接口入口的安全防御手段,本身并不等同于系统的真实安全保障

    即使关闭了 /docs 或 /openapi.json,未授权访问者仍可通过抓包或路由扫描探测具体的 API 路径。因此,在生产环境中,必须配合严格的身份认证、权限校验、速率限制以及网络防火墙策略,才能真正保障 API 接口的数据安全

    总结

    本章正式开启 FastAPI 系列。我们首先了解了 FastAPI 的整体定位、核心技术栈与主要应用场景,并通过与 Flask、Django 的对比,理解了 FastAPI 在现代 API、微服务以及 AI 后端开发中的特点与优势

    随后,我们完成了第一个 FastAPI 应用,初步认识了路由、路径操作函数以及应用启动流程,并学习了 FastAPI 对 Path、Query 和 Request Body 的基本参数识别规则

    最后,我们体验了 FastAPI 基于 OpenAPI 自动生成的交互式 API 文档,并学习了文档信息配置、路由说明、Tags 分组以及文档开关等功能

    至此,我们已经能够创建并运行一个基本的 FastAPI 服务。下一篇将进一步学习基本路由、请求与响应以及 Pydantic 数据模型,开始真正构建结构更加完整的 RESTful API

    Logo

    有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

    更多推荐