大家好,我是jobleap.cn的小九,今天学习FastAPI的使用。
FastAPI 截至2025年的最新稳定版本为 0.110.0,该版本在依赖管理、WebSocket增强、响应模型灵活性等方面引入了多个实用新特性。以下是核心新API及具体代码示例:
1. 全局依赖简化定义:@app.dependency 装饰器
功能 :替代传统的 app.dependencies.append(Depends(...)),更直观地定义全局依赖(所有路径操作都会自动调用)。
代码示例:
python
from fastapi import FastAPI, Depends
from sqlalchemy.orm import Session
from .database import SessionLocal, get_db # 假设的数据库会话工具
app = FastAPI()
# 新语法:定义全局依赖(替代 app.dependencies.append(Depends(get_db)))
@app.dependency
def global_db() -> Session:
db = SessionLocal()
try:
yield db
finally:
db.close()
# 所有路径操作会自动获取 db 依赖
@app.get("/items")
def read_items(db: Session = Depends(global_db)): # 可直接使用全局依赖
return db.query(Item).all() # 假设 Item 是数据库模型
2. WebSocket 认证装饰器:@app.websocket_auth
功能:为 WebSocket 连接添加统一认证逻辑,替代手动在端点内写认证代码,简化权限校验。
代码示例:
python
from fastapi import FastAPI, WebSocket, Depends
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
# 认证逻辑:验证 token 并返回用户
async def get_current_user(token: str = Depends(oauth2_scheme)):
if token != "secret":
raise HTTPException(status_code=401, detail="无效 token")
return {"username": "admin"}
# 新装饰器:为 WebSocket 绑定认证依赖
@app.websocket("/ws")
@app.websocket_auth(Depends(get_current_user)) # 自动执行认证
async def websocket_endpoint(websocket: WebSocket, user: dict): # 认证后的用户会传入
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"已认证用户 {user['username']} 发送:{data}")
3. 依赖分组:Depends(..., group="分组名")
功能:对依赖进行分组管理,方便批量控制依赖的执行顺序或条件启用(例如"认证相关依赖""日志相关依赖")。
代码示例:
python
from fastapi import FastAPI, Depends, HTTPException
app = FastAPI()
# 分组为 "auth" 的依赖:验证 token
async def validate_token(token: str = Header(...)):
if not token:
raise HTTPException(status_code=401, detail="缺少 token")
return token
# 分组为 "auth" 的依赖:检查权限(依赖于 validate_token)
async def check_admin_permission(token: str = Depends(validate_token, group="auth")):
if token != "admin_token":
raise HTTPException(status_code=403, detail="无管理员权限")
# 仅执行 "auth" 分组的依赖(自动按顺序执行同组依赖)
@app.get("/admin")
async def admin_operation(
_: None = Depends(group="auth") # 触发整个 "auth" 分组的依赖
):
return {"message": "管理员操作成功"}
4. 响应模型动态排除空值:response_model_exclude_none 参数
功能 :在路径操作中直接控制响应模型是否排除 None 值(无需在 Pydantic 模型中全局配置)。
代码示例:
python
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional
app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None # 可选字段,可能为 None
# 新参数:response_model_exclude_none=True 会自动排除值为 None 的字段
@app.get("/items/{item_id}", response_model=Item, response_model_exclude_none=True)
async def read_item(item_id: int):
# 返回的 description 为 None,但响应中会自动排除
return {"name": "电脑", "description": None}
响应结果:
json
{"name": "电脑"} # 无 description 字段
5. 动态标签生成:tags 支持可调用对象
功能 :@app.get 等装饰器的 tags 参数支持传入函数,动态生成接口标签(适用于批量管理标签,例如按版本分组)。
代码示例:
python
from fastapi import FastAPI
app = FastAPI()
# 动态生成标签的函数(例如根据版本号)
def get_version_tags(version: str):
return [f"v{version}"]
# tags 传入函数,动态生成标签
@app.get("/v1/items", tags=get_version_tags("1"))
async def get_v1_items():
return {"version": "v1", "items": []}
@app.get("/v2/items", tags=get_version_tags("2"))
async def get_v2_items():
return {"version": "v2", "items": []}
效果 :OpenAPI 文档中,两个接口会分别显示在 v1 和 v2 标签下。
以上新特性均已在 FastAPI 0.110.0 中稳定支持,主要解决了依赖管理繁琐、WebSocket 认证重复编码、响应模型灵活性不足等问题,进一步提升了开发效率。