FastAPI 是一个现代、快速(高性能)的 Python Web 框架,基于标准 Python 类型提示,专为构建 API 设计。它的主要特点是快速开发、高性能、使用类型提示自动生成文档,以及对异步操作的支持。
1. 安装 FastAPI 和 Uvicorn
在开始使用 FastAPI 之前,你需要安装 FastAPI 和 ASGI 服务器(如 Uvicorn)来运行它。
bash
pip install fastapi uvicorn
2. 创建一个简单的 FastAPI 应用
python
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
说明:
FastAPI()
:创建一个 FastAPI 应用实例。@app.get("/")
:这是一个路径操作装饰器,用于声明 HTTP GET 请求的路径(在这个例子中是根路径/
)。read_root
:路径操作函数,当访问/
时,会返回一个包含"Hello": "World"
的 JSON 响应。
3. 运行应用
使用 Uvicorn 运行你的应用:
bash
uvicorn main:app --reload
main:app
:main
是你的 Python 文件名(不带.py
后缀),app
是 FastAPI 实例。--reload
:启用自动重新加载功能,当代码更改时自动重启服务器。
4. 请求方法示例
FastAPI 支持多种 HTTP 方法,如 GET
、POST
、PUT
、DELETE
等。下面是不同方法的示例。
4.1. GET
请求
python
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
说明:
item_id: int
:路径参数,要求为整数类型。q: str = None
:查询参数,可选,默认为None
。
4.2. POST
请求
python
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.post("/items/")
def create_item(item: Item):
return item
说明:
Item
:这是一个使用 Pydantic 定义的数据模型,用于请求体验证。@app.post("/items/")
:声明一个POST
路径操作,当客户端发送一个符合Item
模型的 JSON 对象时,create_item
函数会处理该请求。
5. API 文档自动生成
FastAPI 自动为你生成交互式 API 文档,你可以通过以下地址访问:
- Swagger UI:
http://127.0.0.1:8000/docs
- Redoc:
http://127.0.0.1:8000/redoc
这些文档是基于你的路径操作和 Pydantic 模型自动生成的,方便你测试和理解 API。
6. 异步支持
FastAPI 对异步操作提供了良好的支持,你可以通过使用 async def
来定义异步路径操作函数。
python
@app.get("/async-items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
说明:
async def
:定义一个异步路径操作,FastAPI 能够自动处理异步请求,使得在处理 I/O 操作(如数据库访问或外部 API 请求)时更高效。
7. 路径操作参数
FastAPI 提供了丰富的路径操作参数,可以通过路径参数、查询参数、请求体、表单数据等传递数据。
7.1. 路径参数
python
@app.get("/users/{user_id}/items/{item_id}")
def read_user_item(user_id: int, item_id: int, q: str = None, short: bool = False):
return {"user_id": user_id, "item_id": item_id, "q": q, "short": short}
说明:
- 路径参数
user_id
和item_id
必须出现在路径中,而q
和short
是可选的查询参数。
7.2. 查询参数
查询参数是路径操作函数的参数,但它们不是路径的一部分。它们在 URL 中使用 ?
后指定。
python
@app.get("/items/")
def read_items(q: str = None, limit: int = 10):
return {"q": q, "limit": limit}
8. 请求体和表单数据
FastAPI 能够处理复杂的请求体数据,使用 Pydantic 模型来进行数据验证。
python
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_id": item_id, **item.dict()}
说明:
item: Item
:请求体被解析为Item
类型的实例。
9. 响应模型
你可以使用 Pydantic 模型来定义响应数据的结构,以确保输出的数据符合预期格式。
python
from typing import Optional
class ItemResponse(BaseModel):
name: str
description: Optional[str] = None
price_with_tax: float
@app.post("/items/", response_model=ItemResponse)
def create_item(item: Item):
return ItemResponse(
name=item.name,
description=item.description,
price_with_tax=item.price + (item.tax or 0)
)
说明:
response_model=ItemResponse
:指定响应模型为ItemResponse
,FastAPI 会根据这个模型来过滤和验证响应数据。
10. 中间件与依赖注入
FastAPI 支持中间件和依赖注入,使得在请求生命周期的各个阶段执行额外的逻辑成为可能。
10.1. 中间件
python
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
说明:
CORSMiddleware
用于处理跨域请求,你可以设置允许的来源、方法和头部。
10.2. 依赖注入
python
from fastapi import Depends
def common_parameters(q: str = None, limit: int = 10):
return {"q": q, "limit": limit}
@app.get("/items/")
def read_items(commons: dict = Depends(common_parameters)):
return commons
说明:
Depends
:用于声明依赖,common_parameters
函数的返回值会传递给路径操作函数read_items
。
11. 认证与授权
FastAPI 通过 OAuth2、JWT 等机制支持用户认证与授权。
11.1. 简单的 OAuth2 密码流
python
from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
# 这里应该验证用户并返回 token
return {"access_token": form_data.username, "token_type": "bearer"}
@app.get("/users/me")
async def read_users_me(token: str = Depends(oauth2_scheme)):
return {"token": token}
说明:
OAuth2PasswordBearer
:定义了一个 OAuth2 密码流的认证方案,tokenUrl
指定获取 token 的路径。
总结
FastAPI 是一个强大且高效的框架,适用于构建现代 Web API。它通过类型提示、Pydantic 数据验证和自动生成的文档,极大地提升了开发效率,并支持异步操作、中间件、依赖注入、认证授权等高级特性,非常适合复杂的 Web 应用开发。