同一Strawberry GraphQL Schema能否跨多个FastAPI GraphQLRouter配置不同依赖?
实现单个Strawberry Schema拆分至多GraphQLRouter并配置不同依赖
核心思路
无需拆分已定义的Strawberry Schema,只需基于同一个Schema创建多个GraphQLRouter实例,为每个实例指定独立的context_getter,即可在不同路由挂载不同的依赖链。
具体实现步骤
1. 定义依赖类
from fastapi import Depends class UserManager: def __init__(self): self.user_data = "用户专属数据" class ClientManager: def __init__(self): self.client_data = "客户端专属数据"
2. 创建通用Schema
假设你已经完成了通用Query/Mutation的定义,这里给出示例:
import strawberry @strawberry.type class Query: @strawberry.field def fetch_data(self, info: strawberry.Info) -> str: # 从上下文获取对应管理器并返回数据 if hasattr(info.context, "user_manager"): return info.context.user_manager.user_data elif hasattr(info.context, "client_manager"): return info.context.client_manager.client_data return "无绑定管理器" # 通用Schema,所有路由复用 schema = strawberry.Schema(query=Query)
3. 生成多路由实例
为不同依赖分别创建上下文获取器,再绑定到GraphQLRouter:
from strawberry.fastapi import GraphQLRouter # 绑定UserManager的路由上下文 async def get_user_context(user_manager: UserManager = Depends()): return {"user_manager": user_manager} user_router = GraphQLRouter( schema, context_getter=get_user_context ) # 绑定ClientManager的路由上下文 async def get_client_context(client_manager: ClientManager = Depends()): return {"client_manager": client_manager} client_router = GraphQLRouter( schema, context_getter=get_client_context )
4. 挂载到FastAPI应用
将两个路由挂载到不同路径:
from fastapi import FastAPI app = FastAPI() # 用户专属GraphQL入口 app.include_router(user_router, prefix="/graphql/user") # 客户端专属GraphQL入口 app.include_router(client_router, prefix="/graphql/client")
关键注意点
- 同一个Schema可被多个
GraphQLRouter复用,Strawberry会独立处理各路由的请求解析,无冲突问题。 - Resolver中通过
info.context区分不同依赖实例,保持业务逻辑的通用性。 - 若需路由级前置验证,可在
context_getter中添加额外逻辑(如请求头校验),无需修改Schema本身。
内容的提问来源于stack exchange,提问作者Mark Rogers
相关产品推荐
相关产品推荐

