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
相关产品推荐
相关产品推荐

