FastAPI集成Strawberry GraphQL上下文时依赖注入未生效问题
依赖未正常解析的核心原因
一共两点:
- 第一处是
Depends语法使用错误:FastAPI的Depends()需要传入依赖函数的引用对象,不能传入函数执行后的返回值。你写的Depends(get_current_user())会在代码加载阶段就直接执行get_current_user(),完全违背Depends延迟执行、由框架注入参数的设计逻辑。 - 第二处是最根本的逻辑问题:
GraphQLRouter的context_getter是Strawberry组件内部维护的回调函数,请求到达时由Strawberry直接调用,不会经过FastAPI的依赖注入处理流程。FastAPI的依赖注入机制只会扫描、解析自身路由表中注册的视图函数参数,对第三方组件内部持有的回调函数无感知,自然不会识别你写在get_context参数里的Depends标记,参数无值时就会返回inspect._empty这个参数缺省占位对象。
正确实现方案
context_getter被调用时会自动接收当前请求的Request对象作为入参,你可以直接在函数内部手动执行依赖逻辑:
from fastapi import Request from strawberry.fastapi import GraphQLRouter async def get_context(request: Request): # 手动传入依赖所需的request对象,执行鉴权逻辑 user = await get_current_user(request) log.info(user) return {"user": user, "request": request} graphql_app = GraphQLRouter(schema, graphiql=True, context_getter=get_context)
如果依赖层级较复杂、不想手动维护参数传递,可以调用FastAPI内置的依赖解析工具手动触发解析,注意不同FastAPI版本的API参数可能存在小幅差异。
补充说明:普通路由能正常使用依赖,是因为路由函数直接注册到了FastAPI的路由系统中,框架启动时就完成了依赖扫描和注入逻辑的构建,和context_getter的执行链路完全不同。
内容的提问来源于stack exchange,提问作者MWood
相关产品推荐
相关产品推荐

