microdot.sse — Server-Sent Events¶
Server-Sent Events (SSE) to prosty jednokierunkowy protokół push: klient otwiera zwykłe żądanie HTTP do Content-Type: text/event-stream, a serwer utrzymuje połączenie otwarte i zapisuje sformatowane zdarzenia w miarę ich występowania. Przeglądarka udostępnia strumień jako obiekt JavaScript EventSource. W porównaniu z WebSocketami SSE jest prostszy, gdy tylko serwer wysyła dane; klient zawsze wykonuje żądanie.
Typowe zastosowanie w kamerze to publikowanie wykryć / odczytów sensora / aktualizacji stanu do telefonu lub pulpitu nawigacyjnego w tempie, w jakim się pojawiają, bez konieczności odpytywania przez pulpit.
class SSE¶
- class microdot.sse.SSE¶
Uchwyt, który otrzymuje trasa. Przekazywany do procedur obsługi jako drugi argument, gdy używane jest
with_sse().- async send(data, event: str | None = None, event_id: str | None = None, retry: int | None = None, comment: bool = False)¶
Wysyła pojedyncze zdarzenie do klienta.
- data
Ładunek zdarzenia. Ciągi i bajty są wysyłane bez zmian. Słowniki i listy są serializowane do JSON. Wszystko inne jest konwertowane przez
str().- event
Opcjonalna nazwa zdarzenia –
EventSourceprzeglądarki rozsyła zdarzenie do nasłuchującego JavaScript o tej samej nazwie, gdy jest ona ustawiona.- event_id
Opcjonalny identyfikator zdarzenia – przeglądarka odsyła go jako
Last-Event-ID, jeśli połączenie zostanie zerwane i ponownie nawiązane, co pozwala serwerowi wznowić od miejsca, w którym przerwał.- retry
Opóźnienie ponownego połączenia w sekundach; przeglądarka używa go, jeśli połączenie zostanie zerwane.
- comment
Jeśli
True, ładunek jest wysyłany jako wiersz komentarza SSE (ignorowany przez przeglądarkę). Przydatne jako sygnał podtrzymania (keep-alive), aby zapobiec zamykaniu w innym razie bezczynnego strumienia przez limity czasu NAT.
Dekoratory na poziomie modułu¶
- microdot.sse.with_sse(f)¶
Dekorator zamieniający trasę na punkt końcowy SSE. Procedura obsługi otrzymuje żądanie oraz obiekt
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)
Czas życia procedury obsługi jest równy czasowi życia strumienia – działa ona tak długo, jak długo klient pozostaje połączony. Anulowanie (klient się rozłącza, serwer się zamyka) propaguje się jako
asyncio.CancelledError, który framework połyka.
- microdot.sse.sse_response(request, event_function, *args, **kwargs)¶
Niskopoziomowy punkt wejścia: zwraca krotkę odpowiedzi, którą
with_sse()zwraca pod spodem. Przydatne, gdy punkt końcowy SSE potrzebuje niestandardowych nagłówków lub kodów stanu, na które dekorator nie pozwala: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 przyjmuje
(request, sse, *args, **kwargs)i używaawait sse.send(...)do wysyłania zdarzeń.
Odpowiedź SSE ustawia Content-Type: text/event-stream i utrzymuje połączenie otwarte, dopóki event_function nie zwróci wartości lub klient się nie rozłączy. Użyj pętli while True z await asyncio.sleep między wysyłkami, aby uniknąć gorącej pętli.