Zum Inhalt

WebSockets

Starlette enthält einen WebSocket Klasse, die ähnlich wie HTTP-Anforderungen funktioniert, aber das Senden und Empfangen von Daten auf WebSockets ermöglicht.

Der WebSocket

Unterschrift: WebSocket(scope, receive=None, send=None)

from starlette. websockets import WebSockets (WebSocket importieren)


async def app (scope, receive, send):
    WebSocket = WebSocket (scope = scope, receive = receive, send = send)
    Websocket aufrufen. accept ()
    await websocket. send_text ('Hello, world gaward')[Quelltext bearbeiten]
    Websocket erstellen. close ()

WebSockets bieten eine Mapping-Schnittstelle, sodass Sie sie wie scope verwenden können.

Beispiel:websocket['path'] gibt den ASGI-Pfad zurück.

Uniform Resource Locator (normalerweise auch einfach als Website bezeichnet)

Die WebSocket-URL websocket.url Besuche zu machen.

Diese Eigenschaft ist eigentlich eine Unterklasse von str und macht auch alle Komponenten verfügbar, die aus einer URL aufgelöst werden können.

Zum Beispiel:websocket.url.path,websocket.url.port,websocket.url.scheme.

Überschrift

Die Header werden als unveränderliche, nicht zwischen Groß-und Kleinschreibung unterscheidende Multi-Dictionary ausgesetzt.

Beispielsweise: websocket.headers['sec-websocket-version']

Die Suchparameter

Abfrageparameter sind als unveränderliche mehrfache Wörterbücher verfügbar.

Zum Beispiel: websocket.query_params['search']

Straßenparameter.

Routerpfade werden als dictionary interface aufgedeckt.

Zum Beispiel: websocket.path_params['username']

Verbindung annehmen.

  • await websocket.accept(subprotocol=None, headers=None)

Senden von Daten

  • await websocket.send_text(data)
  • await websocket.send_bytes(data)
  • await websocket.send_json(data)

Ab Version 0.10.0 werden JSON-Nachrichten standardmäßig über Textdatenframes gesendet websocket.send_json(data, mode="binary") verwendet, um JSON über binäre Datenframes zu senden.

Empfangen von Daten

  • await websocket.receive_text()
  • await websocket.receive_bytes()
  • await websocket.receive_json()

Der Text von May Raise starlette.websockets.WebSocketDisconnect() Es scheint nicht ganz in Übereinstimmung mit der üblichen semantischen Ausdruck und schwierig, eine genaue chinesische Übersetzung zu machen Wenn Sie mehr kontextuelle Informationen haben oder die Richtigkeit des Textinhalts bestätigen, werde ich versuchen, Ihnen eine zufriedenstellendere Übersetzung zur Verfügung zu stellen derzeit nach wörtlicher Übersetzung der Worte, die nur übersetzt werden können:"Kann verbessern." starlette.websockets.WebSocketDisconnect() "Vielleicht ist die Übersetzung nicht so relevant."

Ab Version 0.10.0 werden JSON-Nachrichten standardmäßig über Textdatenframes empfangen, wobei websocket.receive_json(data, mode="binary") verwendet wird, um JSON über binäre Datenframes zu empfangen.

Iterationsdaten

  • websocket.iter_text()
  • websocket.iter_bytes()
  • websocket.iter_json()

Ähnlich wie receive_text,receive_bytes und receive_json, aber es gibt einen asynchronen Iterator zurück.

from starlette. websockets import WebSockets (WebSocket importieren)


async def app (scope, receive, send):
    WebSocket = WebSocket (scope = scope, receive = receive, send = send)
    Websocket aufrufen. accept ()
    async für message in websocket. iter_text ():
        await websocket. send_text (f "Nachrichtentext was:{message}")
    Websocket erstellen. close ()

Wenn starlette.websockets.WebSocketDisconnect erhöht wird, wird der Iterator beendet.

Verbindungen schließen.

  • await websocket.close(code=1000, reason=None)

Nachrichten senden und empfangen.

Wenn Sie rohe ASGI-Nachrichten senden oder empfangen müssen, sollten Sie websocket.send() und websocket.receive() anstelle der ursprünglichen aufrufbaren send-und receive-Objekte verwenden, um sicherzustellen, dass der Status von WebSockets ordnungsgemäß aktualisiert wird.

  • await websocket.send(message)
  • await websocket.receive()

Ablehnungs-Antwort senden

Wenn Sie websocket.close() aufrufen, bevor Sie websocket.accept() aufrufen, sendet der Server automatisch einen HTTP 403-Fehler an den Client.

Wenn Sie eine andere Fehlerantwort senden möchten, können Sie die websocket.send_denial_response()-Methode verwenden, die die Antwort sendet und anschließend die Verbindung schließt.

  • await websocket.send_denial_response(response)

Dies erfordert, dass ASGI-Server die WebSocket-Denial-Response-Erweiterung unterstützen, was bei Nichtunterstützung einen RuntimeError-Fehler auslöst.