一、 FastAPI 是什么?
FastAPI 是一个现代、快速(高性能)的 Python Web 框架,用于构建 API。它基于 Python 的类型提示,与 Pydantic 和 Starlette 紧密结合。
现代:它利用了最新的 Python 特性(如类型提示),并遵循了现代 API 标准(如 OpenAPI 和 JSON Schema)。
快速:其性能极高,与 Node.js 和 Go 的框架相当,是现有 Python 框架中最快的之一。
Web 框架:它用于开发 Web 应用程序,特别是后端 API 服务。
文档 :https://fastapi.tiangolo.com/zh/
二、 核心特性与优势
1. 极高的性能
FastAPI 基于 Starlette(一个轻量级的 ASGI 框架/工具包)和 Pydantic。由于 ASGI 的支持,它能够处理异步请求,这使得它在处理高并发 I/O 密集型任务(如网络请求、数据库调用)时表现非常出色。性能基准测试显示,FastAPI 与 Go 和 Node.js 的框架处于同一水平。
2. 快速开发
开发者可以大幅提升开发功能的速度,主要得益于:
强大的智能代码补全:由于使用了类型提示,现代 IDE(如 PyCharm, VS Code)可以提供非常准确和强大的自动完成、错误检查功能。
更少的 Bug:类型提示本身就能在编码阶段捕获许多错误。
3. 直观的 API 设计
框架的设计非常直观,开发者可以轻松地构建出清晰、标准的 RESTful API。
4. 基于标准
完全兼容(并基于)开放的 API 标准:
OpenAPI:用于定义 API 的规范。
JSON Schema:用于定义数据模型的规范。
这意味着你自动获得了与这些标准兼容的工具的天然支持。
5. 自动生成交互式 API 文档
这是 FastAPI 的“杀手级”特性之一。一旦你编写了端点,框架会自动为你生成两套交互式 API 文档:
Swagger UI:访问
/docs即可看到一个功能丰富的界面,你可以在这里查看所有端点,并直接进行 API 调用测试。ReDoc:访问
/redoc可以看到一个非常漂亮的、响应式的文档页面。
你无需手动编写这些文档,它们会根据你的代码自动保持最新。
6. 强大的类型检查和数据验证
通过集成 Pydantic,FastAPI 提供了极其强大和易于使用的数据验证、序列化和文档管理。
你只需使用标准的 Python 类型提示(如
str,int,List[str])或 Pydantic 模型来定义你的数据模型。FastAPI 会自动验证传入的请求数据。如果数据无效(例如,一个字符串传递给整数字段),它会自动返回一个清晰的、描述性的错误响应。
7. “鸭子类型”的依赖注入系统
依赖注入系统设计得非常简单而强大,易于学习和使用。它使得在路径操作函数中共享数据库连接、用户认证等逻辑变得非常容易,并且极大地促进了代码的可重用性和可测试性。
8. 高安全性
内置了对多种安全标准的支持,开箱即用,包括:
HTTP Basic 认证
OAuth2(包括 JWT tokens)
API 密钥(在头部、查询参数或 cookie 中)
三、 与其他框架的简单对比
四、一个简单的代码示例
下面是一个完整的 “Hello World” API,展示了它的简洁性。
from fastapi import FastAPI
from pydantic import BaseModel
# 1. 创建 FastAPI 实例
app = FastAPI()
# 2. 定义一个 Pydantic 数据模型
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
# 3. 创建路径操作(API 端点)
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None): # 类型提示和默认值定义了查询参数
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item): # 请求体将由 Item 模型验证
return {"item_name": item.name, "item_id": item_id}这段代码创建了一个简单的 RESTful API,具有三个端点:
GET /- 返回一个简单的 JSON 问候GET /items/{item_id}- 演示路径参数和查询参数PUT /items/{item_id}- 演示请求体验证
1. 导入和初始化
from fastapi import FastAPI
from pydantic import BaseModel
# 1. 创建 FastAPI 实例
app = FastAPI()from fastapi import FastAPI:导入 FastAPI 核心类from pydantic import BaseModel:导入 Pydantic 的 BaseModel,用于数据验证app = FastAPI():创建 FastAPI 应用实例,这是所有 API 定义的入口点
2. 定义数据模型
# 2. 定义一个 Pydantic 数据模型
class Item(BaseModel):
name: str
price: float
is_offer: bool = None这里定义了一个 Pydantic 模型 Item,它指定了:
name: str- 必须的字符串字段price: float- 必须的浮点数字段is_offer: bool = None- 可选的布尔字段(默认值为None)
这个模型会自动:
验证数据:确保传入数据符合类型要求
生成文档:在 Swagger UI 中显示数据结构
序列化数据:在输入和输出时转换数据
3. 定义 API 端点
第一个端点:根路径
@app.get("/")
def read_root():
return {"Hello": "World"}@app.get("/"):装饰器,表示这是一个处理 GET 请求的端点,路径为/read_root():路径操作函数,当访问/时执行返回一个 Python 字典,FastAPI 会自动将其转换为 JSON:
{"Hello": "World"}
第二个端点:带路径参数和查询参数
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}@app.get("/items/{item_id}"):定义 GET 端点,{item_id}是路径参数item_id: int:FastAPI 会自动将路径参数转换为整数类型q: str = None:定义查询参数q,类型为字符串,默认值None表示它是可选的访问示例:
/items/42?q=searchterm
第三个端点:带请求体
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}@app.put("/items/{item_id}"):定义 PUT 端点item_id: int:路径参数item: Item:请求体参数,使用前面定义的 Pydantic 模型当调用此端点时,FastAPI 会:
验证请求体是否符合
Item模型的定义自动将 JSON 解析为
Item对象在函数中可以直接使用
item.name等属性
自动生成的交互式文档
运行服务器后访问 http://127.0.0.1:8000/docs,你会看到:
Swagger UI 文档包含:
三个端点:
GET /、GET /items/{item_id}、PUT /items/{item_id}参数说明:
路径参数:
item_id(integer, required)查询参数:
q(string, optional)请求体:
Item模型的结构
Try it out 功能:可以直接在浏览器中测试 API
自动验证功能:
如果你尝试发送无效数据,比如:
{
"name": 123, // 不是字符串
"price": "expensive" // 不是数字
}FastAPI 会自动返回详细的错误信息:
{
"detail": [
{
"loc": ["body", "name"],
"msg": "str type expected",
"type": "type_error.str"
},
{
"loc": ["body", "price"],
"msg": "value is not a valid float",
"type": "type_error.float"
}
]
}