1

我有一个反应前端和一个 python 后端(使用ariadne==0.13.0, uvicorn==0.15.0, uvicorn[standard]==0.15.0, fastapi==0.68.1)通过 graphql 订阅进行通信。只要我不重新加载页面或从同一 IP 在新的浏览器窗口中加载页面,一切正常。然后页面崩溃并需要一些时间才能恢复 - 取决于 uvicorn 中配置的 websocket 超时。我的前端和 graphql playgorund 都遇到了同样的问题。我了解不同的浏览器或选项卡使用相同的 IP、端口和协议标识,这可能会破坏现有连接,但仍然应该可以使用来自不同选项卡的页面,如下所示: https://fastapi.tiangolo .com/advanced/websockets/

我的代码:

SCHEMA = load_schema_from_path("schema.graphql")
query = QueryType()
subscription = SubscriptionType()
app = FastAPI()
schema = make_executable_schema(SCHEMA, [query, subscription])
graphql_server = GraphQL(schema, debug=True)
app.add_route("/graphql", graphql_server)
app.add_websocket_route("/graphql", graphql_server)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["POST", "GET"],
    allow_headers=[
        "accept",
        "accept-language",
        "content-language",
        "content-type",
        "x-apollo-tracing",
    ],
)
app.debug = True
uvicorn.run(app, host='0.0.0.0', port=7996)
4

1 回答 1

0

uvicorn 的默认设置是单线程的,实现订阅的方法是同步和阻塞的。我不得不以异步方式重新实现它。

于 2021-10-19T13:00:39.647 回答