You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI中如何传递autocommit参数并让依赖获取Session对象?

解决方案

1. 改造get_db函数支持自定义autocommit参数

修改原生成器函数,添加autocommit参数并设置默认值(保持原有默认行为),创建Session时传入该参数:

from sqlalchemy.orm import Session
from typing import Generator

def get_db(autocommit: bool = False) -> Generator[Session, None, None]:
    session = Session(
        engine,
        expire_on_commit=False,
        autocommit=autocommit  # 使用传入的参数替代固定值
    )
    try:
        yield session
    finally:
        session.close()

使用时如果需要自定义autocommit,通过Depends传递参数即可:

# 示例:开启autocommit
session=Depends(lambda: get_db(autocommit=True))

2. 让validate_roleplay_to_user_mapping获取Session参数

在验证函数的参数列表中声明session依赖,FastAPI会自动注入Session实例;同时可以直接使用路由中已有的roleplay_id和user参数(参数名需匹配):

from fastapi import HTTPException, Depends
from your_models import User, UserRoleplayMapping  # 替换为你的实际模型

def validate_roleplay_to_user_mapping(
    roleplay_id: int,
    user: User = Depends(authenticate_user),
    session: Session = Depends(get_db)
):
    # 执行验证逻辑,示例:检查用户与角色扮演的关联关系
    mapping = session.query(UserRoleplayMapping).filter_by(
        roleplay_id=roleplay_id,
        user_id=user.id
    ).first()
    
    if not mapping:
        raise HTTPException(status_code=403, detail="用户无权访问该角色扮演")
    
    return mapping

3. 路由中的最终使用方式

此时路由函数无需额外修改参数顺序,FastAPI会自动处理依赖注入:

@router.post("/{roleplay_id}/begin")
async def begin_roleplay_session(
    roleplay_id: int,
    request: Request,
    session=Depends(get_db),  # 可根据需求自定义autocommit参数
    user=Depends(authenticate_user),
    user_mapping_validation=Depends(validate_roleplay_to_user_mapping),
):
    # 编写你的业务逻辑
    return {"status": "success", "roleplay_id": roleplay_id}

关键说明

  • FastAPI在同一请求中,同一个依赖会被复用,因此路由函数和验证函数拿到的是同一个Session实例。
  • 如果验证函数需要使用特定的autocommit配置,只需修改其session依赖的参数,比如session: Session = Depends(lambda: get_db(autocommit=True))。

内容的提问来源于stack exchange,提问作者Ouroboros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:56:12