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 认证重复编码、响应模型灵活性不足等问题,进一步提升了开发效率。

相关推荐
小小亮014 分钟前
Next.js基础
开发语言·前端·javascript
华洛11 分钟前
我用AI做了一个48秒的真人精品漫剧,不难也不贵
前端·javascript·后端
Novlan11 小时前
我把 Claude Code 里的隐藏彩蛋提取出来了——零依赖的 ASCII 虚拟宠物系统
前端
IAUTOMOBILE1 小时前
Python 流程控制与函数定义:从调试现场到工程实践
java·前端·python
好大哥呀2 小时前
C++ Web 编程
开发语言·前端·c++
ShineWinsu2 小时前
对于Linux:进程优先级、进程切换以及进程调度的解析
linux·面试·笔试·进程·进程切换·进程调度·进程优先级
爱学习的小仙女!2 小时前
面试题 前端(一)DOCTYPE作用 标准模式与混杂模式区分
前端·前端面试题
evan20202 小时前
Qwen3-ASR 1.7B 音频转字幕 懒人整合包
github
小小小小宇3 小时前
前端转后端基础- 变量和类型
前端
Cobyte4 小时前
1.基于依赖追踪和触发的响应式系统的本质
前端·javascript·vue.js