FastAPI WebSocket: endpoints, difusión y tests

FastAPI WebSocket

FastAPI WebSocket: endpoint, gestor de difusión y tests | We.Inc

Escribe un endpoint WebSocket en FastAPI, difunde a todos los clientes con un gestor de conexiones, lee tokens de la query, gestiona las desconexiones y pruébalo todo con TestClient.

En FastAPI declaras una ruta de socket con @app.websocket("/ws") y una función async que recibe un WebSocket. Ejecuta await websocket.accept() y luego recorre en bucle receive_text() y send_text(). Captura WebSocketDisconnect para limpiar cuando un cliente se va. Instala antes el paquete websockets y haz las pruebas con TestClient.websocket_connect().

Los métodos de WebSocket que más usarás

El generador de endpoints de abajo escribe un main.py funcional a partir de unas pocas opciones: la ruta, si los mensajes son texto plano o JSON, si todos los clientes reciben todos los mensajes y si debe llegar un token en el query string. Incluye un archivo de pytest a juego. Cada opción corresponde a un patrón de la documentación de FastAPI, reescrito aquí como un único archivo ejecutable.

Preguntas frecuentes

¿Por qué mi WebSocket de FastAPI devuelve 404 o no hace el upgrade?

Empieza por la instalación: la documentación de WebSocket de FastAPI te pide añadir el paquete websockets junto a FastAPI. Después revisa la ruta, porque una ruta declarada con @app.websocket solo responde a upgrades de socket, nunca a GET HTTP normales. Cerrar el socket antes de accept() también aparece como un handshake rechazado (HTTP 403).

¿Cómo difundo un mensaje a todos los clientes?

Guarda los sockets aceptados en una lista dentro de una pequeña clase gestora, añádelos al conectar, quítalos al desconectar y recorre la lista invocando send_text. El generador de arriba produce exactamente esto cuando marcas la opción de difusión.

¿La difusión funciona con varios workers de Uvicorn?

No con una lista en memoria. Cada worker es un proceso separado con su propia lista. La documentación de FastAPI remite a encode/broadcaster, que retransmite los mensajes a través de Redis o PostgreSQL para que todos los procesos reciban todos los mensajes.

¿Puedo usar Depends y Query en una ruta WebSocket?

Sí. Los endpoints WebSocket aceptan Depends, Query, Cookie, Header, Path y Security igual que las rutas HTTP, así que una dependencia de autenticación se puede compartir entre ambas.

¿Cómo pruebo un endpoint WebSocket?

Crea un TestClient para la app y abre el socket en un bloque with usando client.websocket_connect("/ws"). Dentro, send_text y receive_text dirigen la conversación, y al salir del bloque se cierra la conexión.

Qué hace el bucle del endpoint

Autenticación antes de accept

El endpoint funcional más pequeño

main.py: eco

Acepta y luego devuelve cada mensaje como eco hasta que el cliente se desconecte.

Difusión con un gestor de conexiones

Una clase gestora compartida por todas las conexiones

Funciona en un solo proceso. Cambia la lista por un relé respaldado por Redis antes de escalar horizontalmente.

Pruebas con TestClient

No hace falta servidor: el cliente habla con la app dentro del mismo proceso. Ejecútalo con pytest.

Generador de endpoints WebSocket para FastAPI

Elige cómo debe comportarse el endpoint y copia un main.py completo más un archivo de pytest que lo comprueba.

Formato de los mensajes

Texto plano

JSON

Enviar cada mensaje a todos los clientes conectados

Exigir un token en el query string (?token=...)

Ejecuta: fastapi dev main.py, y luego conéctate a ws://localhost:8000{v}

Empieza gratis · Sin tarjeta de crédito

Relacionado: Guías

Producto

Para quién es

Funciones

Recursos

Empresa

Mapa del sitio