microdot.websocket — WebSocket-Unterstützung¶
WebSockets sind eine bidirektionale, persistente Verbindung über HTTP – nach einem Upgrade-Handshake senden und empfangen Client und Server gerahmte Nachrichten über denselben Socket. Verwenden Sie sie, wenn die Kamera und eine browserseitige Anwendung Vollduplex-Verkehr benötigen, den SSE (einseitiges Push) und einfaches HTTP-Polling nicht kostengünstig bieten können.
class WebSocket¶
- class microdot.websocket.WebSocket(request)¶
Der Handle, den die Route erhält. Wird Handlern als zweites Argument übergeben, wenn
with_websocket()verwendet wird; nicht direkt konstruieren.Klassenattribute
- max_message_length: int¶
Maximale Nutzlastgröße, die
receive()akzeptiert. Nachrichten, die größer als dieser Wert sind, lösen einenWebSocketErroraus und schließen die Verbindung.0deaktiviert die Prüfung (beachten Sie Speichererschöpfungsangriffe, wenn Sie dies festlegen).-1(Standard) verwendetRequest.max_body_length.
- CONT: int¶
Continuation-Frame-Opcode,
0x0. Kennzeichnet einen Frame, der die Nutzlast des vorherigen Frames derselben Nachricht fortsetzt. Microdot erzeugt selbst keine Continuation-Frames (jede Nachricht wird als einzelner Frame versendet) und weist sie beim Empfang zurück, aber die Konstante wird für Anwendungen bereitgestellt, die eine eigene Framing-Logik implementieren.
- TEXT: int¶
Text-Frame-Opcode,
0x1. Der Opcode, densend()automatisch wählt, wenn data einstrist; die Nutzlast wird beim Versand UTF-8-kodiert.
- BINARY: int¶
Binär-Frame-Opcode,
0x2. Der Opcode, densend()automatisch wählt, wenn databytes/bytearrayist; die Nutzlast wird unverändert gesendet.
- CLOSE: int¶
Close-Frame-Opcode,
0x8. Wird vonclose()gesendet; der Empfang eines solchen Frames löst einenWebSocketError(„Websocket connection closed“) ausreceive()aus.
- PING: int¶
Ping-Frame-Opcode,
0x9. Microdot beantwortet eingehende Pings automatisch innerhalb vonreceive()mit einem passendenPONG; die Anwendung bekommt sie normalerweise nicht zu sehen.
- PONG: int¶
Pong-Frame-Opcode,
0xA. Wird automatisch als Antwort auf einPINGgesendet. Eingehende Pongs werden stillschweigend verworfen.
Instanzattribute
- request: microdot.Request¶
Der ursprüngliche
microdot.Request– dasselbe Objekt, das der Route-Handler erhalten hat.
- closed: bool¶
True, sobaldclose()ausgeführt wurde. Prüfen Sie dies, um doppeltes Schließen in Aufräumpfaden zu vermeiden.
Methoden
- async receive()¶
Wartet auf die nächste Nachricht vom Client und gibt sie zurück. Der Rückgabetyp entspricht dem Frame-Opcode:
strfür Text-Frames,bytesfür Binär-Frames.ping-Frames werden automatisch mit einempongbeantwortet;pong-Frames werden stillschweigend verworfen; einclose-Frame löst einenWebSocketError(„Websocket connection closed“) aus.
- async send(data, opcode: int | None = None)¶
Sendet data an den Client. Strings werden als Text-Frames gesendet, Bytes als Binär-Frames; übergeben Sie opcode explizit, um dies zu überschreiben.
- async close()¶
Sendet einen Close-Frame und markiert die Verbindung als geschlossen. Wird automatisch aufgerufen, wenn der Wrapper von
with_websocket()beendet wird.
class WebSocketError¶
- exception microdot.websocket.WebSocketError¶
Wird innerhalb von
WebSocket.receive()ausgelöst, wenn die Verbindung endet oder das Protokoll verletzt wird. Verwenden Sie dies in einer Route, um normale Client-Verbindungsabbrüche zu erkennen:try: message = await ws.receive() except WebSocketError: # client closed the connection
Decorators auf Modulebene¶
- microdot.websocket.with_websocket(f)¶
Decorator, der eine Route in einen WebSocket-Endpunkt umwandelt. Der Handler erhält die Anfrage und ein
WebSocket-Objekt:from 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)
Die Lebensdauer des Handlers entspricht der Lebensdauer der Verbindung. Eine Rückkehr, eine ausgelöste Exception oder ein Verbindungsabbruch des Clients schließt den WebSocket sauber.
- async microdot.websocket.websocket_upgrade(request)¶
Low-Level-Upgrade-Helfer. Verwenden Sie dies innerhalb einer Route, wenn das Upgrade bedingt erfolgen soll – z. B. erst nachdem eine Autorisierungsprüfung bestanden wurde:
@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())
Gibt den hochgestuften
WebSocketzurück. Der Handler mussmicrodot.Response.already_handledzurückgeben (oder eine Exception auslösen), sobald er fertig ist – microdot hat den Socket bereits übernommen.
Die Implementierung unterstützt die Standard-Opcodes für Text und Binär, Ping / Pong sowie ein sauberes Schließen. Fragmentierte (Continuation-)Frames werden nicht unterstützt – jede Nachricht wird als einzelner Frame gesendet, was für die typischen Kameraanwendungen mit kleinen Nachrichten angemessen ist.