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
,而在后台它似乎使用websockets
。 websockets.connect
默认使用 ping_interval
和 ping_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 答案中获取“lastEventId”?
在 Python FastAPI 中使用 websocket 并行发送/接收