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

同一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:05:31