microdot.sse — Server-Sent Events

Server-Sent Events (SSE) je jednostavan jednosmjerni protokol guranja: klijent otvara običan HTTP zahtjev prema Content-Type: text/event-stream, a poslužitelj drži vezu otvorenom i zapisuje oblikovane događaje kako se događaju. Preglednik izlaže tok kao JavaScript objekt EventSource. U usporedbi s WebSocketima, SSE je jednostavniji kada samo poslužitelj gura; klijent uvijek zahtijeva.

Tipična uporaba na kameri je objavljivanje detekcija / očitanja senzora / ažuriranja statusa na telefon ili nadzornu ploču brzinom kojom se događaju, bez potrebe da nadzorna ploča ispituje.

class SSE

class microdot.sse.SSE

Ručka koju ruta prima. Prosljeđuje se rukovateljima kao drugi argument kada se koristi with_sse().

async send(data, event: str | None = None, event_id: str | None = None, retry: int | None = None, comment: bool = False)

Gura pojedinačni događaj klijentu.

data

Sadržaj događaja. Nizovi znakova i bajtovi šalju se kakvi jesu. Rječnici i popisi serijaliziraju se u JSON. Sve ostalo pretvara se s str().

event

Opcionalni naziv događaja – preglednikov EventSource šalje ga JavaScript osluškivaču istog naziva kada je postavljen.

event_id

Opcionalni id događaja – preglednik ga šalje natrag kao Last-Event-ID ako se veza prekine i ponovno uspostavi, što poslužitelju omogućuje nastavak od mjesta gdje je stao.

retry

Kašnjenje ponovnog povezivanja u sekundama; preglednik ga koristi ako se veza prekine.

comment

Ako je True, sadržaj se šalje kao redak SSE komentara (preglednik ga zanemaruje). Korisno kao otkucaj srca za održavanje veze koji sprječava NAT istek vremena da zatvori inače neaktivan tok.

Dekoratori na razini modula

microdot.sse.with_sse(f)

Dekorator koji pretvara rutu u SSE krajnju točku. Rukovatelj prima zahtjev i objekt SSE

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)

Trajanje rukovatelja jednako je trajanju toka – izvršava se sve dok klijent ostaje povezan. Otkazivanje (klijent se odspoji, poslužitelj se ugasi) širi se kao asyncio.CancelledError, koju okvir proguta.

microdot.sse.sse_response(request, event_function, *args, **kwargs)

Niskorazinska ulazna točka: vraća n-torku odgovora koju with_sse() vraća u pozadini. Korisno kada SSE krajnja točka treba prilagođena zaglavlja ili statusne kodove koje dekorator ne dopušta:

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)

event_function prima (request, sse, *args, **kwargs) i koristi await sse.send(...) za guranje događaja.

SSE odgovor postavlja Content-Type: text/event-stream i drži vezu otvorenom dok event_function ne vrati ili se klijent ne odspoji. Koristite while True petlju s await asyncio.sleep između slanja kako biste izbjegli vrtnju u praznoj petlji.