FastAPI使用APIRouter时无法显示GraphQL界面且访问接口报错
报错原因
你定义的路由函数中request参数没有添加Request类型注解,FastAPI会将无类型声明的参数默认识别为查询参数,因此会提示缺少request查询字段。
无GraphQL操作界面的原因
- 你调用的
handle_graphql方法仅负责处理GraphQL业务查询逻辑,不会返回GraphiQL调试界面的HTML内容 - 路由仅绑定了GET请求,且指定的
response_model和GraphQL返回结构完全不匹配,既无法正常返回查询结果,也无法渲染调试界面
修复方案
- 导入FastAPI的
Request类型,给路由参数添加类型注解 - 替换
handle_graphql为handle_request方法,该方法会自动判断请求类型,GET请求返回调试界面,POST请求处理查询逻辑 - 移除错误的
response_model声明,同时给路由绑定GET、POST两种请求方法
修复后代码示例:
from fastapi import Request from fastapi import APIRouter from starlette.graphql import GraphQLApp import graphene from graphene.execution.executors.asyncio import AsyncioExecutor # 你的GraphQL服务定义保持不变 class GraphqlService(graphene.ObjectType): hello = graphene.String(name=graphene.String(default_value="stranger")) @staticmethod def resolve_hello(self, info, name): return "Hello " + name router = APIRouter() graphql_app = GraphQLApp(schema=graphene.Schema(query=GraphqlService), executor_class=AsyncioExecutor) # 修正后的路由定义 @router.api_route('/db_article', methods=["GET", "POST"]) async def db_articles(request: Request): return await graphql_app.handle_request(request)
修复后重启服务,访问对应地址即可看到GraphQL调试界面。
内容的提问来源于stack exchange,提问作者MStikh
相关产品推荐
相关产品推荐

