microdot.sse — Server-Sent Events¶
A Server-Sent Events (SSE) egy egyszerű, egyirányú push protokoll: a kliens egy normál HTTP kérést nyit egy Content-Type: text/event-stream típushoz, a szerver pedig nyitva tartja a kapcsolatot, és formázott eseményeket ír, ahogy azok bekövetkeznek. A böngésző a streamet egy JavaScript EventSource objektumként teszi elérhetővé. A WebSocketekhez képest az SSE egyszerűbb, amikor csak a szerver push-ol; a kliens mindig kér.
A tipikus kamerás felhasználás az észlelések / érzékelő-leolvasások / állapotfrissítések közzététele egy telefonra vagy irányítópultra azon a sebességen, ahogy bekövetkeznek, anélkül, hogy az irányítópultnak le kellene kérdeznie.
class SSE¶
- class microdot.sse.SSE¶
A handle, amelyet a route kap. A kezelőknek második argumentumként kerül átadásra, amikor a
with_sse()használatban van.- async send(data, event: str | None = None, event_id: str | None = None, retry: int | None = None, comment: bool = False)¶
Egyetlen esemény push-olása a kliensnek.
- data
Az esemény payloadja. A karakterláncok és bájtok változatlanul kerülnek elküldésre. A dict-ek és listák JSON-ná szerializálódnak. Minden más
str()-rel alakul át.- event
Opcionális eseménynév – a böngésző
EventSourceobjektuma egy azonos nevű JavaScript figyelőhöz továbbít, ha ez be van állítva.- event_id
Opcionális esemény-azonosító – a böngésző visszaküldi
Last-Event-IDformában, ha a kapcsolat megszakad és újracsatlakozik, ami lehetővé teszi a szerver számára, hogy onnan folytassa, ahol abbahagyta.- retry
Újracsatlakozási késleltetés másodpercben; a böngésző ezt használja, ha a kapcsolat megszakad.
- comment
Ha
True, a payload SSE megjegyzéssorként kerül elküldésre (a böngésző figyelmen kívül hagyja). Hasznos életjel-szívverésként, hogy megakadályozza, hogy a NAT-időtúllépések lezárjanak egy egyébként tétlen streamet.
Modulszintű dekorátorok¶
- microdot.sse.with_sse(f)¶
Dekorátor, amely egy route-ot SSE végponttá alakít. A kezelő megkapja a kérést és egy
SSEobjektumot:from microdot import Microdot from microdot.sse import with_sse app = Microdot() @app.get('/events') @with_sse async def events(request, sse): import asyncio while True: await sse.send({'temp': read_sensor()}, event='reading') await asyncio.sleep(1)
A kezelő élettartama megegyezik a stream élettartamával – addig fut, amíg a kliens csatlakozva marad. A megszakítás (a kliens lecsatlakozik, a szerver leáll)
asyncio.CancelledErrorformában terjed, amelyet a keretrendszer elnyel.
- microdot.sse.sse_response(request, event_function, *args, **kwargs)¶
Alacsony szintű belépési pont: visszaadja azt a válasz-tuple-t, amelyet a
with_sse()a háttérben visszaad. Hasznos, amikor egy SSE végpontnak egyéni fejlécekre vagy státuszkódokra van szüksége, amelyeket a dekorátor nem enged meg:from microdot.sse import sse_response @app.get('/events') async def events(request): if not request.g.current_user: return 401 async def emit(req, sse): await sse.send('hello') return sse_response(request, emit)
Az event_function a
(request, sse, *args, **kwargs)paramétereket kapja, és azawait sse.send(...)segítségével push-ol eseményeket.
Az SSE válasz beállítja a Content-Type: text/event-stream fejlécet, és nyitva tartja a kapcsolatot, amíg az event_function vissza nem tér, vagy a kliens le nem csatlakozik. Használjon egy while True hurkot egy await asyncio.sleep szünettel a küldések között, hogy elkerülje a forró ciklust.