在FastHTML中使用SSE,无需重连
import random
from asyncio import sleep
from fasthtml.common import *
hdrs=(Script(src="https://unpkg.com/[email protected]/sse.js"),)
app,rt = fast_app(hdrs=hdrs)
@rt
def index():
return Titled("SSE Random Number Generator",
P("Generate pairs of random numbers, as the list grows scroll downwards."),
Div(hx_ext="sse",
sse_connect="/number-stream",
hx_swap="beforeend show:bottom",
sse_close="done",
sse_swap="message",
)
)
shutdown_event = signal_shutdown()
async def number_generator():
# while not shutdown_event.is_set():
for i in range(5):
data = Article(f"{i}...{random.randint(1, 100)}")
yield sse_message(data)
await sleep(1)
yield "event: done"
@rt("/number-stream")
async def numbers(): return EventStream(number_generator())
serve()
在上面的代码中,我使用了来自fasthtml tutorials 的一个随机生成器。我想在生成了5 个随机数字后停止。不幸的是它总是会重新连接。我的初衷是使用 sse\_close 配合一个自定义事件名(请参阅 htmx文档),但这并没有奏效。
有什么想法?
解决方案
我想我已经有答案了。我需要把它改成:
async def number_generator():
for i in range(5):
data = Article(f"{i}...{random.randint(1, 100)}")
yield sse_message(data)
await sleep(1)
yield sse_message(Div(''), event="done")
说明:
即使使用 **sse\_message("", event="done")** 也不起作用,因为它不会产生一个正确的SSE消息:
event: done \n
这不会起作用。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。