microdot.websocket — podpora WebSocket¶
WebSocket je obousměrné trvalé spojení přes HTTP – po upgrade handshake si klient a server posílají a přijímají rámcované zprávy na stejném socketu. Použijte je, když kamera a aplikace na straně prohlížeče potřebují plně duplexní provoz, který jim SSE (jednosměrný push) ani obyčejné HTTP dotazování levně poskytnout nedokáží.
class WebSocket¶
- class microdot.websocket.WebSocket(request)¶
Handle, který trasa přijímá. Předává se handlerům jako druhý argument, když se používá
with_websocket(); nekonstruujte jej přímo.Atributy třídy
- max_message_length: int¶
Maximální velikost payloadu, kterou
receive()přijme. Zprávy větší než tato hodnota vyvolajíWebSocketErrora uzavřou spojení.0kontrolu vypne (pozor na útoky vyčerpáním paměti, pokud toto nastavíte).-1(výchozí) použijeRequest.max_body_length.
- CONT: int¶
Opkód pokračovacího rámce,
0x0. Označuje rámec, který pokračuje v payloadu předchozího rámce téže zprávy. Microdot sám pokračovací rámce nevytváří (každá zpráva odchází jako jediný rámec) a při příjmu je odmítá, ale konstanta je zpřístupněna pro aplikace implementující vlastní rámcování.
- TEXT: int¶
Opkód textového rámce,
0x1. Opkód, kterýsend()zvolí automaticky, když je data typustr; payload je při odeslání zakódován jako UTF-8.
- BINARY: int¶
Opkód binárního rámce,
0x2. Opkód, kterýsend()zvolí automaticky, když je data typubytes/bytearray; payload se odesílá doslovně.
- CLOSE: int¶
Opkód uzavíracího rámce,
0x8. Odesílá se metodouclose(); jeho přijetí vyvoláWebSocketError(„Websocket connection closed“) zreceive().
- PING: int¶
Opkód ping rámce,
0x9. Microdot na příchozí pingy automaticky odpovídá odpovídajícímPONGuvnitřreceive(); aplikace je obvykle nepozoruje.
- PONG: int¶
Opkód pong rámce,
0xA. Odesílá se automaticky jako odpověď naPING. Příchozí pongy jsou tiše zahozeny.
Atributy instance
- request: microdot.Request¶
Původní
microdot.Request– tentýž objekt, který obdržel handler trasy.
- closed: bool¶
Truepoté, co proběhla metodaclose(). Zkontrolujte, abyste se vyhnuli dvojímu uzavření v úklidových cestách.
Metody
- async receive()¶
Čeká na další zprávu od klienta a vrátí ji. Návratový typ odpovídá opkódu rámce:
strpro textové rámce,bytespro binární rámce. Napingrámce se automaticky odpovídá rámcempong;pongrámce jsou tiše zahozeny; rámecclosevyvoláWebSocketError(„Websocket connection closed“).
- async send(data, opcode: int | None = None)¶
Odešle data klientovi. Řetězce se odesílají jako textové rámce, bajty jako binární rámce; pro přepsání předejte opcode explicitně.
- async close()¶
Odešle uzavírací rámec a označí spojení jako uzavřené. Volá se automaticky, když skončí wrapper funkce
with_websocket().
class WebSocketError¶
- exception microdot.websocket.WebSocketError¶
Vyvolává se uvnitř
WebSocket.receive(), když spojení skončí nebo je porušen protokol. Použijte to v trase k detekci normálního odpojení klienta:try: message = await ws.receive() except WebSocketError: # client closed the connection
Dekorátory na úrovni modulu¶
- microdot.websocket.with_websocket(f)¶
Dekorátor, který přemění trasu na WebSocket endpoint. Handler obdrží požadavek a objekt
WebSocketfrom microdot import Microdot from microdot.websocket import with_websocket app = Microdot() @app.get('/echo') @with_websocket async def echo(request, ws): while True: msg = await ws.receive() await ws.send(msg)
Životnost handleru se rovná životnosti spojení. Návrat, vyvolání výjimky nebo odpojení klienta WebSocket čistě uzavře.
- async microdot.websocket.websocket_upgrade(request)¶
Nízkoúrovňový pomocník pro upgrade. Použijte jej uvnitř trasy, když má upgrade proběhnout podmíněně – např. až po úspěšné kontrole autorizace:
@app.get('/private') async def private(request): if not authenticate(request): abort(401) ws = await websocket_upgrade(request) while True: msg = await ws.receive() await ws.send(msg.upper())
Vrací upgradovaný
WebSocket. Handler musí po dokončení vrátitmicrodot.Response.already_handled(nebo vyvolat výjimku) – microdot již převzal socket.
Implementace podporuje standardní textové a binární opkódy, ping / pong a čisté uzavření. Fragmentované (pokračovací) rámce podporovány nejsou – každá zpráva se odesílá jako jediný rámec, což je vhodné pro typické kamerové aplikace s malými zprávami.