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

相关推荐
Mr Xu_几秒前
Vue 3 中计算属性的最佳实践:提升可读性、可维护性与性能
前端·javascript
、BeYourself4 分钟前
解决git@github.com: Permission denied (publickey)
github
jerrywus7 分钟前
我写了个 Claude Code Skill,再也不用手动切图传 COS 了
前端·agent·claude
玖月晴空11 分钟前
探索关于Spec 和Skills 的一些实战运用-Kiro篇
前端·aigc·代码规范
子兮曰16 分钟前
深入理解滑块验证码:那些你不知道的防破解机制
前端·javascript·canvas
会一丢丢蝶泳的咻狗42 分钟前
Sass实现,蛇形流动布局
前端·css
攀登的牵牛花1 小时前
前端向架构突围系列 - 状态数据设计 [8 - 4]:有限状态机 (FSM) 在复杂前端逻辑中的应用
前端
Lsx_1 小时前
前端视角下认识 AI Agent 和 LangChain
前端·人工智能·agent
UrbanJazzerati1 小时前
Python编程基础:类(class)和构造函数
后端·面试
我是伪码农1 小时前
Vue 智慧商城项目
前端·javascript·vue.js