microdot.sse --- Server-Sent Events¶
Server-Sent Events (SSE) adalah protokol push satu arah yang sederhana: klien membuka request HTTP normal ke Content-Type: text/event-stream, dan server menjaga koneksi tetap terbuka dan menulis event yang terformat saat terjadi. Browser mengekspos stream sebagai objek JavaScript EventSource. Dibandingkan dengan WebSocket, SSE lebih sederhana ketika hanya server yang mendorong; klien selalu meminta.
Penggunaan kamera yang umum adalah mempublikasikan deteksi / pembacaan sensor / pembaruan status ke ponsel atau dasbor sesuai dengan laju kejadiannya, tanpa dasbor harus melakukan polling.
class SSE¶
- class microdot.sse.SSE¶
Handle yang diterima route. Diteruskan ke handler sebagai argumen kedua ketika
with_sse()digunakan.- async send(data, event: str | None = None, event_id: str | None = None, retry: int | None = None, comment: bool = False)¶
Dorong satu event ke klien.
- data
Payload event. String dan byte dikirim apa adanya. Dict dan list diserialisasi ke JSON. Yang lainnya dikonversi dengan
str().- event
Nama event opsional --
EventSourcebrowser mendispatch ke listener JavaScript dengan nama yang sama ketika ini diset.- event_id
ID event opsional -- browser mengirimkannya kembali sebagai
Last-Event-IDjika koneksi terputus dan tersambung kembali, yang memungkinkan server melanjutkan dari tempat terakhir.- retry
Penundaan koneksi ulang dalam detik; browser menggunakan ini jika koneksi terputus.
- comment
Jika
True, payload dikirim sebagai baris komentar SSE (diabaikan oleh browser). Berguna sebagai heartbeat keep-alive untuk mencegah timeout NAT menutup stream yang sedang tidak aktif.
Dekorator level modul¶
- microdot.sse.with_sse(f)¶
Dekorator yang mengubah route menjadi endpoint SSE. Handler menerima request dan objek
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)
Masa hidup handler sama dengan masa hidup stream -- handler berjalan selama klien tetap terhubung. Pembatalan (klien terputus, server mati) dipropagasikan sebagai
asyncio.CancelledError, yang akan ditelan oleh kerangka kerja.
- microdot.sse.sse_response(request, event_function, *args, **kwargs)¶
Titik masuk level rendah: mengembalikan tuple respons yang dikembalikan
with_sse()secara internal. Berguna ketika endpoint SSE membutuhkan header kustom atau kode status yang tidak diizinkan oleh dekorator: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 menerima
(request, sse, *args, **kwargs)dan menggunakanawait sse.send(...)untuk mendorong event.
Respons SSE menetapkan Content-Type: text/event-stream dan menjaga koneksi tetap terbuka sampai event_function kembali atau klien terputus. Gunakan loop while True dengan await asyncio.sleep di antara pengiriman untuk menghindari hot-looping.