概述
FastAPI 是一个基于 Python 的高性能 Web 框架, 专门用于快速构建 API 接口服务. 它基于 Starlette 和 Pydantic 构建, 支持 async/await 语法, 性能可媲美 NodeJS 和 Go.
核心特性
异步高性能: 基于 ASGI 标准, 支持异步编程, 性能接近 NodeJS 和 Go
开发效率高: Pydantic 类型提示与验证, 减少手动校验代码
自动生成文档: Swagger UI 交互式文档和 ReDoc 文档, 浏览器中直接调用和测试 API
- 类型安全: 利用 Python 类型注解, 自动数据验证和序列化
- 依赖注入: 强大的依赖注入系统, 简化代码复用
Ref. FastAPI Features
安装配置
系统要求
- Python 3.8+
- 推荐使用虚拟环境隔离项目依赖
安装步骤
1 | # 使用 Homebrew 安装 Python (如果未安装) |
1 | # 使用 winget 安装 Python (如果未安装) |
1 | # Ubuntu/Debian 安装 Python |
Ref. FastAPI Installation
依赖说明
FastAPI 提供多种安装选项:
| 安装方式 | 命令 | 包含依赖 | 适用场景 |
|---|---|---|---|
| 标准版 | pip install "fastapi[standard]" |
uvicorn, fastapi-cli, fastapi-cloud-cli 等 | 生产环境推荐 |
| 标准版 (无云 CLI) | pip install "fastapi[standard-no-fastapi-cloud-cli]" |
uvicorn, fastapi-cli 等 | 不需要云部署功能 |
| 精简版 | pip install fastapi |
仅核心框架 | 需要精确控制依赖 |
P.S. 从 FastAPI 最新版本开始, 标准依赖不再默认包含, 需要显式指定 [standard] 才会安装 uvicorn 等常用依赖.
Ref. FastAPI Dependencies
快速开始
第一个 FastAPI 程序
创建 main.py 文件:
1 | from fastapi import FastAPI |
e.g. 以上代码定义了两个路由:
GET /- 返回欢迎消息GET /hello- 返回中文问候
Ref. FastAPI First Steps
运行项目
1 | # 开发环境运行 (带自动重载) |
参数说明:
main:app- main.py 文件中的 app 对象--reload- 代码更改后自动重启服务器 (仅开发环境)--host- 绑定的主机地址, 0.0.0.0 表示所有网络接口--port- 监听端口号--workers- worker 进程数 (生产环境)
P.S. --reload 选项在开发环境中很有用, 但会消耗更多资源且不够稳定, 生产环境切勿使用.
Ref. Uvicorn Deployment
访问项目
- API 服务: http://127.0.0.1:8000/
- 交互式文档 (Swagger UI): http://127.0.0.1:8000/docs
- 文档 (ReDoc): http://127.0.0.1:8000/redoc
e.g. 访问 http://127.0.0.1:8000/docs 可以看到自动生成的交互式 API 文档, 可以直接在浏览器中测试接口.
核心功能
同步与异步
FastAPI 支持同步和异步两种函数定义方式. 异步函数使用 async def 定义, 可以利用 await 关键字处理 I/O 操作, 提高并发性能.
1 | import time |
e.g. 同步函数会阻塞请求处理, 每个请求必须等待前一个请求完成.
1 | import asyncio |
e.g. 异步函数可以同时处理多个 I/O 操作, 显著提高并发性能.
路由
路由就是 URL 地址和处理函数之间的映射关系, 它决定了当用户访问某个特定网址时, 服务器应该执行哪段代码来返回结果.
路由定义
FastAPI 的路由定义基于 Python 的装饰器模式:
1 |
|
装饰器说明:
@app.get("/")- 定义 GET 请求方法, 路径为/async def root()- 异步处理函数return {...}- 返回 JSON 响应
HTTP 方法
FastAPI 支持所有常见的 HTTP 方法:
1 | # GET 请求 - 查询资源 |
e.g. 使用对应的装饰器来定义不同 HTTP 方法的路由.
Ref. Path Operation Decorators
参数
参数就是客户端发送请求时附带的额外信息和指令. 参数的作用是让同一个接口能根据不同的输入, 返回不同的输出, 实现动态交互.
参数分类
| 参数类型 | 位置 | 作用 | HTTP 方法 |
|---|---|---|---|
| 路径参数 | URL 路径的一部分 /book/{id} |
指向唯一的、特定的资源 | GET |
| 查询参数 | URL? 之后 k1=v1&k2=v2 |
对资源集合进行过滤、排序、分页等操作 | GET |
| 请求体 | HTTP 请求的消息体 (body) 中 | 创建、更新资源, 携带大量数据 (如 JSON) | POST、PUT 等 |
Ref. Request Body
路径参数
路径参数是 URL 路径的一部分, 用于指向唯一的、特定的资源.
基础用法
1 | from fastapi import FastAPI, Path |
e.g. 访问 /book/1 会返回 {"id": 1, "title": "这是第1本书"}
类型注解 Path
FastAPI 允许为参数声明额外的信息和校验:
1 |
|
Path 参数说明
| 参数 | 说明 | 示例 |
|---|---|---|
... |
必填 | id: int = Path(...) |
gt |
大于 | gt=0 表示必须大于 0 |
ge |
大于等于 | ge=1 表示必须大于等于 1 |
lt |
小于 | lt=101 表示必须小于 101 |
le |
小于等于 | le=100 表示必须小于等于 100 |
description |
描述 | description="用户ID" |
min_length |
最小长度 (字符串) | min_length=2 |
max_length |
最大长度 (字符串) | max_length=10 |
e.g. 使用 Path 参数可以限制 ID 的取值范围为 1-100, 如果用户传入 0 或 101 会返回 422 验证错误.
Ref. Path Parameters
查询参数
查询参数位于 URL? 之后, 用于对资源集合进行过滤、排序、分页等操作.
基础用法
声明的参数不是路径参数时, 路径操作函数会把该参数自动解释为查询参数:
1 | from fastapi import FastAPI, Query |
e.g. 访问 /news/news_list?skip=0&limit=10 会返回 {"skip": 0, "limit": 10}
类型注解 Query
1 |
|
Query 参数说明
| 参数 | 说明 | 示例 |
|---|---|---|
... |
必填 | q: str = Query(...) |
gt |
大于 | gt=0 |
ge |
大于等于 | ge=1 |
lt |
小于 | lt=100 |
le |
小于等于 | le=50 |
default |
默认值 | default=10 |
description |
描述 | description="搜索关键词" |
min_length |
最小长度 | min_length=2 |
max_length |
最大长度 | max_length=50 |
e.g. 使用 Query 参数可以限制 skip 必须小于 100, 如果用户传入 100 会返回 422 验证错误.
Ref. Query Parameters
请求体参数
请求体参数位于 HTTP 请求的消息体 (body) 中, 用于创建、更新资源, 携带大量数据 (如 JSON).
在 HTTP 协议中, 一个完整的请求由三部分组成:
- 请求行: 包含方法、URL、协议版本
- 请求头: 元数据信息 (Content-Type、Authorization 等)
- 请求体: 实际要发送的数据内容
基础用法
- 定义类型 (继承 BaseModel)
- 类型注解
1 | from fastapi import FastAPI |
e.g. 发送 POST 请求到 /register, 请求体为 {"username": "test", "password": "123456"}
类型注解 Field
1 | from pydantic import BaseModel, Field |
Field 参数说明
| 参数 | 说明 | 示例 |
|---|---|---|
... |
必填 | username: str = Field(...) |
gt |
大于 | price: float = Field(gt=0) |
ge |
大于等于 | age: int = Field(ge=18) |
lt |
小于 | discount: float = Field(lt=1) |
le |
小于等于 | quantity: int = Field(le=100) |
default |
默认值 | status: str = Field(default="active") |
description |
描述 | description="用户名" |
min_length |
最小长度 | min_length=2 |
max_length |
最大长度 | max_length=50 |
e.g. 使用 Field 参数可以限制用户名长度为 2-10 个字符, 密码长度为 3-20 个字符.
Ref. Request Body
混合参数
FastAPI 可以同时使用路径参数、查询参数和请求体参数:
1 | from fastapi import FastAPI, Path, Query |
e.g. PUT 请求到 /books/1?q=search, 请求体为 {"title": "Python编程", "author": "张三"}
FastAPI 会根据以下规则自动识别参数类型:
- 如果参数在路径中声明, 则作为路径参数
- 如果参数是单数类型 (int, float, str, bool 等), 则作为查询参数
- 如果参数是 Pydantic 模型类型, 则作为请求体
Ref. Mix Path, Query and Body Parameters
响应类型
默认情况下, FastAPI 会自动将路径操作函数返回的 Python 对象 (字典、列表、Pydantic 模型等), 经由 jsonable_encoder 转换为 JSON 兼容格式, 并包装为 JSONResponse 返回.
如果需要返回非 JSON 数据 (如 HTML、文件流), FastAPI 提供了丰富的响应类型.
内置响应类型
| 响应类型 | 用途 | 示例 |
|---|---|---|
| JSONResponse | 默认响应, 返回 JSON 数据 | return {"key": "value"} |
| HTMLResponse | 返回 HTML 内容 | return HTMLResponse(html_content) |
| PlainTextResponse | 返回纯文本 | return PlainTextResponse("text") |
| FileResponse | 返回文件下载 | return FileResponse(path) |
| StreamingResponse | 流式响应 | 生成器函数返回数据 |
| RedirectResponse | 重定向 | return RedirectResponse(url) |
| ORJSONResponse | 使用 orjson 的更快 JSON 响应 | return ORJSONResponse(content) |
Ref. Response Models
响应类型设置方式
场景: 固定返回类型 (HTML、纯文本等)
1 | from fastapi import FastAPI |
场景: 文件下载、图片、流式响应
1 | from fastapi import FastAPI |
e.g. 方式一适用于固定返回类型的场景, 方式二适用于需要动态返回不同类型的场景.
Ref. Custom Response - HTML, Stream, File, others
响应 HTML 格式
1 | from fastapi import FastAPI |
e.g. 访问 /html 会返回完整的 HTML 页面.
响应文件格式
FileResponse 是 FastAPI 提供的专门用于高效返回文件内容 (如图片、PDF、Excel、音视频等) 的响应类. 它能够智能处理文件路径、媒体类型推断、范围请求和缓存头部, 是服务静态文件的推荐方式.
1 | from fastapi import FastAPI |
e.g. 访问 /file/document.pdf 会下载 PDF 文件.
P.S. FileResponse 会自动处理以下内容:
- 根据文件扩展名推断 Content-Type
- 支持范围请求 (用于视频播放)
- 自动设置缓存头部
Ref. Using FileResponse
自定义响应数据格式
response_model 是路径操作装饰器 (如 @app.get 或 @app.post) 的关键参数, 它通过一个 Pydantic 模型来严格定义和约束 API 端点的输出格式. 这一机制在提供自动数据验证和序列化的同时, 更是保障数据安全性的第一道防线.
1 | from fastapi import FastAPI |
e.g. 使用 response_model=News 后, 只有 News 模型中定义的字段会返回给客户端, internal_field 会被过滤掉.
P.S. response_model 的作用:
- 定义响应数据格式
- 自动数据验证和序列化
- 过滤敏感字段 (如密码、内部字段)
- 在自动文档中生成响应示例
Ref. Response Model
错误处理
使用 HTTPException 返回错误响应:
1 | from fastapi import FastAPI, HTTPException, status |
e.g. 当 item_id 不存在时, 返回 404 错误.
P.S. HTTPException 是 FastAPI 处理错误的推荐方式, 它会自动返回格式化的 JSON 错误响应.
Ref. Exception Handling
最佳实践
项目结构
推荐的项目结构:
✅ 推荐的项目结构
1 | my_project/ |
Ref. Bigger Applications - Multiple Files
常见问题
❓ FastAPI 和 Flask 的区别
🚀 如何部署 FastAPI
Q2: 如何部署 FastAPI 应用?
推荐使用 Docker 容器化部署:
1 | FROM python:3.11 |
也可以使用 Gunicorn + Uvicorn:
1 | pip install gunicorn |
Ref. Deployment - Docker
📁 文件上传处理
Q3: 如何处理文件上传?
使用 UploadFile 处理文件上传:
1 | from fastapi import FastAPI, File, UploadFile |
Ref. Request Files
🔌 WebSocket 实现
Q4: 如何实现 WebSocket?
FastAPI 原生支持 WebSocket:
1 | from fastapi import FastAPI, WebSocket |
Ref. WebSockets
🧪 编写测试
Q5: 如何编写测试?
使用 pytest 和 httpx 测试 FastAPI 应用:
1 | pip install pytest httpx |
1 | from fastapi.testclient import TestClient |
Ref. Testing





