fastapi - FastAPI graphql 订阅
问题描述
我尝试在 FastAPI 上实现简单的 graphql 订阅。
根据文件,但它不起作用
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 实现订阅服务器
我尝试了,但还不行
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
错误接收:
return self.ws.open is False
AttributeError: 'WebSocket' object has no attribute 'open'
我做错了什么以及如何解决?谢谢你。
解决方案
我想到了
以下是可行的解决方案
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()))
推荐阅读
- apache-spark - 如何将具有相同/共享分区的 HDFS 文件块应用于同一数据节点上的不同文件/表
- angular - IonicRouteStrategy 和 RouteReuseStrategy
- node.js - Heroku 部署和流量
- php - 如何使用 ejabberd 一次性向我名册中的所有朋友发送消息或向我名册中的每个人广播消息?
- bigdata - 无法在 Vespa 的 Document 中动态添加 Postion(纬度和经度)类型字段
- json - 使用 Vue JS 从 API 中获取数据时遇到问题
- r - 排列 R 闪亮的侧边栏对象
- xamarin.android - 安装 Microsoft.Azure.Mobile.Client NuGet 包后生成错误
- java - 监控方法统计
- javascript - 在第一次渲染时获取 cookie 返回 undefined with universal-cookie