microdot.sse --- Server-Sent Events

Server-Sent Events (SSE) là một giao thức đẩy một chiều đơn giản: client mở một HTTP request thông thường đến Content-Type: text/event-stream, và máy chủ giữ kết nối mở và ghi các sự kiện được định dạng khi chúng xảy ra. Trình duyệt hiển thị stream như một đối tượng JavaScript EventSource. So với WebSockets, SSE đơn giản hơn khi chỉ máy chủ đẩy; client luôn yêu cầu.

Việc sử dụng camera điển hình là xuất bản các phát hiện / đọc cảm biến / cập nhật trạng thái đến điện thoại hoặc bảng điều khiển theo tốc độ chúng xảy ra, mà không cần bảng điều khiển phải thăm dò.

class SSE

class microdot.sse.SSE

Handle mà route nhận được. Được truyền vào các trình xử lý như đối số thứ hai khi with_sse() đang được sử dụng.

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

Đẩy một sự kiện đơn lẻ đến client.

data

Payload sự kiện. Chuỗi và bytes được gửi nguyên dạng. Dict và list được serialize thành JSON. Bất kỳ thứ gì khác được chuyển đổi bằng str().

event

Tên sự kiện tùy chọn -- EventSource của trình duyệt gửi đến một listener JavaScript cùng tên khi điều này được đặt.

event_id

Id sự kiện tùy chọn -- trình duyệt gửi lại nó như Last-Event-ID nếu kết nối bị ngắt và kết nối lại, cho phép máy chủ tiếp tục từ nơi dừng lại.

retry

Độ trễ kết nối lại tính bằng giây; trình duyệt sử dụng điều này nếu kết nối bị ngắt.

comment

Nếu True, payload được gửi như một dòng comment SSE (bị trình duyệt bỏ qua). Hữu ích như một heartbeat keep-alive để ngăn các timeout NAT đóng một stream rỗi.

Decorator cấp module

microdot.sse.with_sse(f)

Decorator biến một route thành một endpoint SSE. Trình xử lý nhận request và một đối tượng 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)

Thời gian tồn tại của trình xử lý bằng với thời gian tồn tại của stream -- nó chạy miễn là client vẫn kết nối. Hủy (client ngắt kết nối, máy chủ tắt) được lan truyền dưới dạng asyncio.CancelledError, mà framework nuốt đi.

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

Điểm vào cấp thấp: trả về tuple phản hồi mà with_sse() trả về bên dưới. Hữu ích khi một endpoint SSE cần các header tùy chỉnh hoặc mã trạng thái mà decorator không cho phép:

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 nhận (request, sse, *args, **kwargs) và sử dụng await sse.send(...) để đẩy các sự kiện.

Phản hồi SSE đặt Content-Type: text/event-stream và giữ kết nối mở cho đến khi event_function trả về hoặc client ngắt kết nối. Sử dụng vòng lặp while True với await asyncio.sleep giữa các lần gửi để tránh hot-looping.