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-IDako 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
SSEfrom 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 koristiawait 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.