首页 > 解决方案 > 如何在graphql fastapi中进行依赖注入时获取graphiql ide?

问题描述

到目前为止,这是我的代码,我想将 AuthJWT 作为依赖注入:

from starlette.graphql import GraphQLApp
from starlette.requests import Request as Rq
from fastapi_jwt_auth import AuthJWT
    
    
graphql_app = GraphQLApp(schema=graphene.Schema(query=Query, mutation=Mutation))

@router.post("/gql")
async def graph(request: Rq, Authorize: AuthJWT = Depends() ):
    request.state.authorize = Authorize
    return await graphql_app.handle_graphql(request=request)

app.include_router(router)

它在 insomnia ide 上的 post 请求工作正常,但我无法在浏览器中的“localhost:8000/gql”url 中看到 graphiql ide
它给出错误:“GET /gql HTTP/1.1”405 Method Not Allowed

我怎样才能得到graphiql ide?

是否可以通过自定义请求和 APIRoute 类获取 ide?https://fastapi.tiangolo.com/advanced/custom-request-and-route/

标签: fastapi

解决方案


@IndominusByte 的回答

import graphene
from fastapi import FastAPI, Request, Depends
from fastapi_jwt_auth import AuthJWT
from starlette.graphql import GraphQLApp
from starlette.datastructures import URL
from pydantic import BaseModel

class Settings(BaseModel):
    authjwt_secret_key: str = "secret"

@AuthJWT.load_config
def get_config():
    return Settings()

class Query(graphene.ObjectType):
    hello = graphene.String(name=graphene.String(default_value="stranger"))

    def resolve_hello(self, info, name):
        authorize = info.context['request'].state.authorize
        access_token = authorize.create_access_token(subject=name)
        return "Hello " + name + "access_token" + access_token


app = FastAPI()
graphql_app = GraphQLApp(schema=graphene.Schema(query=Query))

# graphiql ide path here
@app.get('/') 
async def graphiql(request: Request):
    request._url = URL('/gql')
    return await graphql_app.handle_graphiql(request=request)


# use the path for frontend request
@app.post('/gql') 
async def graphql(request: Request, authorize: AuthJWT = Depends()):
    request.state.authorize = authorize
    return await graphql_app.handle_graphql(request=request)

https://github.com/IndominusByte/fastapi-jwt-auth/issues/28


推荐阅读