在FastHTML中使用SSE,无需重连

编程语言 2026-07-11
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章