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ő EventSource objektuma 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-ID formá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 SSE objektumot:

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.CancelledError formá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 az await 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.