- 什么是 FastAPI?
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于使用 Python 3.6+ 构建 API。它基于标准 Python 类型提示(Type Hints),具有以下核心特点:
- 高性能:基于 Starlette 和 Pydantic,性能可与 NodeJS 和 Go 媲美。
- 快速编码:减少约 40% 的重复代码,开发速度极快。
- 少 Bug:利用类型提示减少人为错误。
- 自动文档:自动生成交互式 API 文档(Swagger UI 和 ReDoc)。
- 生产就绪:支持 ASGI 标准,易于部署。
2. 为什么选择 FastAPI?
🚀 极速性能
FastAPI 是目前最快的 Python 框架之一。在基准测试中,它的性能往往优于 Flask 和 Django,这得益于其异步(Async)支持和底层优化。
🛡️ 数据验证与类型安全
这是 FastAPI 最强大的功能之一。它利用 Pydantic 模型来定义数据结构。你只需要定义类型,FastAPI 会自动处理:
- 数据验证(类型检查、必填项等)。
- 数据转换(如字符串转整数)。
- 自动序列化/反序列化。
📄 自动生成的文档
写完代码后,你不需要手动编写文档。FastAPI 会根据你的代码自动生成交互式文档。
- 访问
/docs:查看 Swagger UI。 - 访问
/redoc:查看 ReDoc。 前端开发人员可以直接在浏览器中测试接口。
🔄 原生异步支持
FastAPI 完全支持 Python 的 async 和 await 语法。这意味着你可以轻松处理高并发连接,非常适合 I/O 密集型应用(如数据库查询、外部 API 调用)。
3. 快速上手:5 分钟构建第一个 API
第一步:安装
你需要安装 FastAPI 和一个 ASGI 服务器(推荐 Uvicorn)。
python
pip install fastapi uvicorn
第二步:编写代码
创建一个名为 main.py 的文件:
python
from fastapi import FastAPI
from pydantic import BaseModel
# 初始化应用
app = FastAPI(title="我的第一个 FastAPI 应用")
# 定义数据模型 (用于请求体)
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
# 定义路由
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
@app.post("/items/")
async def create_item(item: Item):
# FastAPI 会自动验证 item 的数据类型
response_item = item.dict()
if item.price > 100:
response_item["message"] = "这是个昂贵的物品"
return response_item
第三步:运行服务
在终端中运行以下命令:
python
uvicorn main:app --reload
main: 文件名 (main.py)。app: FastAPI 实例变量名。--reload: 开发模式下,代码修改后自动重启。
第四步:查看文档
打开浏览器访问 http://127.0.0.1:8000/docs。你会看到一个功能完整的交互式界面,可以直接测试刚才写的接口!
4. 核心功能深度解析
1. 强大的依赖注入系统 (Dependency Injection)
FastAPI 拥有 Python 框架中最强大的依赖注入系统之一。它可以轻松处理数据库会话、用户认证、公共参数等。
python
from fastapi import Depends, FastAPI
app = FastAPI()
# 定义一个依赖项
async def common_parameters(q: str = None, skip: int = 0, limit: int = 100):
return {"q": q, "skip": skip, "limit": limit}
# 在路由中使用依赖
@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
return commons
好处:代码复用性高,测试方便,逻辑解耦。
2. 请求数据的多来源处理
FastAPI 可以智能地从不同位置获取参数:
- 路径参数 :
/items/{item_id} - 查询参数 :
/items/?skip=0 - 请求头 :
Headers - Cookie :
Cookies - 请求体 :
JSON Body(通过 Pydantic 模型)
3. 后台任务
如果你需要在返回响应后执行耗时操作(如发送邮件),可以使用 BackgroundTasks。
python
from fastapi import BackgroundTasks
def send_email(email: str):
# 模拟发送邮件
pass
@app.post("/send-email/")
async def send_email_api(email: str, background_tasks: BackgroundTasks):
background_tasks.add_task(send_email, email)
return {"message": "邮件已在后台发送"}
5. 推荐的项目结构
对于小型 Demo,单文件没问题。但对于生产环境,建议采用模块化结构:
my_project/
├── app/
│ ├── __init__.py
│ ├── main.py # 应用入口
│ ├── config.py # 配置管理
│ ├── models.py # 数据库模型 (ORM)
│ ├── schemas.py # Pydantic 数据模型
│ ├── dependencies.py # 依赖注入
│ └── routers/ # 路由模块
│ ├── __init__.py
│ ├── users.py
│ └── items.py
├── tests/ # 测试文件
├── requirements.txt
└── .env # 环境变量
6. 生态系统与扩展
FastAPI 拥有活跃的社区和丰富的扩展:
- SQLModel: 由 FastAPI 作者开发,结合了 SQLAlchemy 和 Pydantic,让数据库操作更简单。
- FastAPI-Utils: 提供许多实用工具函数。
- Pydantic Settings: 方便地管理应用配置和环境变量。
7. 总结:什么时候该用 FastAPI?
✅ 适合场景:
- 构建 RESTful API 或 GraphQL API。
- 需要高性能和高并发。
- 团队熟悉 Python 类型提示。
- 需要自动生成文档以便前后端协作。
- 微服务架构。
❌ 不适合场景:
- 需要渲染服务端 HTML 模板的传统网站(虽然支持,但 Django/Flask 更成熟)。
- 团队完全不了解异步编程(
async/await),且项目简单无需高性能。
结语
FastAPI 不仅仅是一个框架,它代表了 Python Web 开发的现代化方向。它通过利用 Python 最新的语言特性,极大地提升了开发体验和运行效率。如果你正在寻找一个既能快速原型开发,又能胜任高并发生产环境的框架,FastAPI 绝对值得加入你的技术栈。
现在就开始尝试吧,你会发现写 API 原来可以如此愉悦!