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 --
EventSourcecủ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-IDnế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
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)
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ụngawait 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.