fastapi的最新版本,提供了哪些新api可供使用

大家好,我是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 文档中,两个接口会分别显示在 v1v2 标签下。

以上新特性均已在 FastAPI 0.110.0 中稳定支持,主要解决了依赖管理繁琐、WebSocket 认证重复编码、响应模型灵活性不足等问题,进一步提升了开发效率。

相关推荐
论迹2 小时前
【JavaEE】-- Spring Web MVC入门
前端·spring·java-ee
G***66912 小时前
前端组件单元测试覆盖率,目标与实现
前端·单元测试
天天进步20152 小时前
前端单元测试从入门到精通:Jest与Testing Library实战
前端·单元测试
U***49832 小时前
前端组件单元测试模拟数据,Mock Service Worker
前端·单元测试
ZT_KeBei2 小时前
前端调试利器——pageSpy的使用简易指南
前端
少卿2 小时前
PerformanceObserver 性能条目类型(Entry Types)
前端·javascript
宇余2 小时前
ES2025新特性实战:5分钟get前端高频实用语法
前端·typescript
励扬程序2 小时前
Cocos Creator 3.8 实现指定Node节点截图功能教程
前端·cocos creator
jenchoi4132 小时前
【2025-11-15】软件供应链安全日报:最新漏洞预警与投毒预警情报汇总
前端·网络·安全·网络安全·npm·node.js