首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FastAPI graphql订阅

FastAPI graphql订阅
EN

Stack Overflow用户
提问于 2021-08-04 01:26:22
回答 1查看 160关注 0票数 0

我尝试在FastAPI上实现简单的graphql订阅。

根据文档,但它不起作用

代码语言:javascript
复制
import asyncio

import graphene
from fastapi import FastAPI
from starlette.graphql import GraphQLApp
from graphql.execution.executors.asyncio import AsyncioExecutor
from starlette.websockets import WebSocket


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

    async def resolve_hello(self,info,name):
        return "Hello " + name

class Subscription(graphene.ObjectType):
    count = graphene.Int(upto=graphene.Int())

    async def subscribe_count(root, info, upto=3):
        for i in range(upto):
            yield i
            await asyncio.sleep(1)

app = FastAPI()


schema = graphene.Schema(query=Query, subscription=Subscription)
app.add_route("/", GraphQLApp(schema=schema, executor_class=AsyncioExecutor))

我谷歌了一下,发现我可能需要像Sanic或Aiohttp那样实现订阅服务器

我试过了,但还不起作用

代码语言:javascript
复制
from graphql_ws.websockets_lib import WsLibSubscriptionServer

subscription_server = WsLibSubscriptionServer(schema)

@app.websocket("/subscriptions")
async def subscriptions(websocket: WebSocket):
    await subscription_server.handle(websocket)
    return websocket

错误接收:

代码语言:javascript
复制
 return self.ws.open is False
AttributeError: 'WebSocket' object has no attribute 'open'

我做错了什么,该如何解决?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-08-04 19:47:20

我想通了

以下是可行的解决方案

代码语言:javascript
复制
import asyncio

import graphene
import pydantic
from fastapi import FastAPI
from starlette_graphene3 import GraphQLApp, make_playground_handler
from graphene_pydantic import PydanticObjectType


class Subscription(graphene.ObjectType):
    count = graphene.String()

    async def subscribe_count(root, info):
        for i in range(300):
            yield f"{i}"
            await asyncio.sleep(1)

schema = graphene.Schema(query=Query, subscription=Subscription)


app.mount("/", GraphQLApp(schema, on_get=make_playground_handler()))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68644380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档