FastAPI websocket ping/pong 超时

Posted

技术标签:

【中文标题】FastAPI websocket ping/pong 超时【英文标题】:FastAPI websocket ping/pong timeout 【发布时间】:2020-12-29 23:39:13 【问题描述】:

我正在使用带有 @app.websocket 的 FastAPI 来监听传入的 websocket。 FastAPI(或下面的 Starlette 或 Uvicorn)如何进行 ping/pong 心跳?这是可配置的吗?我在文档中根本找不到。

from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket("/")
def ws(websocket: WebSocket):
    pass

fastapi 使用starlette,而在后台它似乎使用websocketswebsockets.connect 默认使用 ping_intervalping_timeout 20 秒,但我不知道这是否在 FastAPI 中使用。

【问题讨论】:

乒乓球发生在 uvicorn,目前还没有配置这些值的方法,这里有一个未解决的问题:github.com/encode/uvicorn/issues/245,欢迎 PR! @euri10 感谢您的指点。我很高兴知道它使用相同的 20 秒默认值。我很想做公关,但现在我对内部的了解还不够透彻,无法知道如何通过公关。我会继续挖掘,谢谢鼓励。 @euri10 刚刚看到github.com/encode/uvicorn/pull/1048。非常感谢,太完美了。如果你想把它变成一个答案,我很乐意接受它并给你互联网积分:) 哈哈谢谢提醒!我添加了一个反映当前使用情况的答案! 【参考方案1】:

您现在可以使用以下 2 个标志:

    --ws-ping-interval <float> - 设置 WebSockets ping 间隔,以秒为单位。请注意,这只能与默认的websockets 协议一起使用。 --ws-ping-timeout <float> - 设置 WebSockets ping 超时,以秒为单位。请注意,这只能与默认的websockets 协议一起使用。

【讨论】:

有没有办法在代码中以编程方式执行此操作?某处等待 websocket.accept() @Sayanc2000 运行 uvicorn 时,您可以将它们传递给 run 方法,例如uvicorn.run('app:app', ws_ping_interval=300, ws_ping_timeout=300)

以上是关于FastAPI websocket ping/pong 超时的主要内容,如果未能解决你的问题,请参考以下文章

FastAPI websocket 无法处理大量数据传入?

FastAPI 在子进程中从 websocket 发送

如何从 fastapi websocket 答案中获取“lastEventId”?

在 Python FastAPI 中使用 websocket 并行发送/接收

如何在没有 html/js 的情况下捕获 fastapi websocket 消息?

尝试使用 websockets 从 FastAPI 获取实时数据流时如何修复错误(不支持的升级请求。)?