From bd7a2428661318099ecec1e43175e399b7d743da Mon Sep 17 00:00:00 2001 From: Erik Gaasedelen Date: Sat, 3 Jan 2026 18:02:20 -0800 Subject: [PATCH] Fix live reload infinite loop on uvicorn >= 0.39 Keep WebSocket handler alive by waiting on receive() instead of returning immediately after accept(). Fixes #817. --- fasthtml/live_reload.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fasthtml/live_reload.py b/fasthtml/live_reload.py index 7a2111fc..b8072e98 100644 --- a/fasthtml/live_reload.py +++ b/fasthtml/live_reload.py @@ -1,4 +1,5 @@ from starlette.routing import WebSocketRoute +from starlette.websockets import WebSocketDisconnect from fasthtml.basics import FastHTML, Script __all__ = ["FastHTMLWithLiveReload"] @@ -23,7 +24,11 @@ def LiveReloadJs(reload_attempts:int=20, reload_interval:int=1000, **kwargs): """ return Script(src % (reload_attempts, reload_interval)) -async def live_reload_ws(websocket): await websocket.accept() +async def live_reload_ws(websocket): + await websocket.accept() + try: + while True: await websocket.receive() + except WebSocketDisconnect: pass class FastHTMLWithLiveReload(FastHTML): """