FastAPI WebSocket ping/pong 超时时间

9

我正在使用 FastAPI 和 @app.websocket 监听传入的 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使用20秒的ping_intervalping_timeout,但我无法确定它是否在FastAPI中使用。


4
乒乓操作发生在uvicorn中,目前没有办法对这些值进行配置,这里有一个开放的问题: https://github.com/encode/uvicorn/issues/245, 欢迎提交PR! - euri10
@euri10 感谢你的指引。很高兴知道它使用相同的20秒默认值。我很想做一个PR,但现在我还不太了解内部工作原理,不知道如何传递。我会继续探索,感谢你的鼓励。 - Jonathan
@euri10 刚刚看到了 https://github.com/encode/uvicorn/pull/1048。非常感谢,这太完美了。如果你想把它变成一个答案,我会很乐意接受并给你互联网积分 :) - Jonathan
1
哈哈,谢谢提醒!我添加了一个反映当前使用情况的答案! - euri10
1个回答

6
您现在可以使用以下2个标志:
  1. --ws-ping-interval <float> - 设置WebSockets ping间隔,以秒为单位。请注意,这只能与默认的websockets协议一起使用。
  2. --ws-ping-timeout <float> - 设置WebSockets ping超时时间,以秒为单位。请注意,这只能与默认的websockets协议一起使用。

在代码中有没有以编程方式执行此操作的方法?在 await websocket.accept() 的某个地方。 - Sayanc2000
2
@Sayanc2000 当运行uvicorn时,你可以将它们传递给run方法,例如:uvicorn.run('app:app', ws_ping_interval=300, ws_ping_timeout=300) - TJR
uvicorn main:app --ws-ping-timeout 2.0 预计在2秒内终止WebSocket,但对我来说无效。时间变成了32秒。 - Prashant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接