FastAPI WebSocket: Endpoints, Broadcasting und Tests

FastAPI WebSocket

FastAPI WebSocket: Endpoint, Broadcast-Manager und Tests | We.Inc

Schreibe einen FastAPI-WebSocket-Endpoint, sende mit einem Connection Manager an alle Clients, lies Tokens aus der Query, behandle Verbindungsabbrüche und teste alles mit TestClient.

In FastAPI deklarierst du eine Socket-Route mit @app.websocket("/ws") und einer async-Funktion, die einen WebSocket entgegennimmt. Rufe await websocket.accept() auf und laufe dann in einer Schleife über receive_text() und send_text(). Fange WebSocketDisconnect ab, um aufzuräumen, wenn ein Client geht. Installiere vorher das Paket websockets und teste mit TestClient.websocket_connect().

Die WebSocket-Methoden, die du am häufigsten aufrufst

Der Endpoint-Builder unten schreibt aus wenigen Entscheidungen eine funktionierende main.py: den Routenpfad, ob Nachrichten reiner Text oder JSON sind, ob jeder Client jede Nachricht hört und ob ein Token im Query-String ankommen muss. Eine passende pytest-Datei gibt es dazu. Jede Option entspricht einem Muster aus der FastAPI-Dokumentation, hier als eine einzige lauffähige Datei umgeschrieben.

Häufige Fragen

Warum liefert mein FastAPI-WebSocket 404 oder schafft das Upgrade nicht?

Fang bei der Installation an: Die FastAPI-Doku zu WebSockets verlangt, dass du das Paket websockets zusätzlich zu FastAPI installierst. Prüfe dann den Pfad, denn eine mit @app.websocket deklarierte Route beantwortet nur Socket-Upgrades, nie normale HTTP-GETs. Auch ein Schließen des Sockets vor accept() zeigt sich als abgelehnter Handshake (HTTP 403).

Wie sende ich eine Nachricht an alle Clients?

Bewahre akzeptierte Sockets in einer Liste in einer kleinen Manager-Klasse auf, füge sie beim Verbinden hinzu, entferne sie beim Trennen und laufe über die Liste, um send_text aufzurufen. Der Builder oben erzeugt genau das, wenn du die Broadcast-Option anhakst.

Funktioniert Broadcasting mit mehreren Uvicorn-Workern?

Nicht mit einer Liste im Speicher. Jeder Worker ist ein eigener Prozess mit eigener Liste. Die FastAPI-Doku verweist auf encode/broadcaster, das Nachrichten über Redis oder PostgreSQL weiterleitet, sodass jeder Prozess jede Nachricht hört.

Kann ich Depends und Query in einer WebSocket-Route verwenden?

Ja. WebSocket-Endpoints akzeptieren Depends, Query, Cookie, Header, Path und Security genau wie HTTP-Routen, sodass eine Authentifizierungs-Dependency für beide genutzt werden kann.

Wie teste ich einen WebSocket-Endpoint?

Erstelle einen TestClient für die App und öffne den Socket in einem with-Block mit client.websocket_connect("/ws"). Darin steuern send_text und receive_text die Unterhaltung, und das Verlassen des Blocks schließt die Verbindung.

Was die Endpoint-Schleife tut

Authentifizierung vor accept

Der kleinste funktionierende Endpoint

main.py: Echo

Akzeptieren und dann jede Nachricht zurückschicken, bis der Client die Verbindung trennt.

Broadcast mit einem Connection Manager

Eine Manager-Klasse für alle Verbindungen

Funktioniert für einen einzelnen Prozess. Tausche die Liste gegen eine Weiterleitung über Redis, bevor du horizontal skalierst.

Testen mit TestClient

Kein Server nötig: Der Client spricht im selben Prozess mit der App. Führe es mit pytest aus.

Builder für FastAPI-WebSocket-Endpoints

Lege fest, wie sich der Endpoint verhalten soll, und kopiere eine vollständige main.py plus eine pytest-Datei, die sie prüft.

Nachrichtenformat

Reiner Text

JSON

Jede Nachricht an alle verbundenen Clients senden

Ein Token im Query-String verlangen (?token=...)

Starten: fastapi dev main.py, dann mit ws://localhost:8000{v} verbinden

Kostenlos starten · Keine Kreditkarte nötig

Verwandt: Ratgeber

Produkt

Für wen

Funktionen

Ressourcen

Unternehmen

Sitemap