You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5.6 KiB

WebSockets

Puedes usar WebSockets con FastAPI.

Instalar WebSockets

Asegúrate de crear un entorno virtual{.internal-link target=_blank}, activarlo e instalar websockets:

$ pip install websockets

---> 100%

Cliente WebSockets

En producción

En tu sistema de producción, probablemente tengas un frontend creado con un framework moderno como React, Vue.js o Angular.

Y para comunicarte usando WebSockets con tu backend probablemente usarías las utilidades de tu frontend.

O podrías tener una aplicación móvil nativa que se comunica con tu backend de WebSocket directamente, en código nativo.

O podrías tener alguna otra forma de comunicarte con el endpoint de WebSocket.


Pero para este ejemplo, usaremos un documento HTML muy simple con algo de JavaScript, todo dentro de un string largo.

Esto, por supuesto, no es lo ideal y no lo usarías para producción.

En producción tendrías una de las opciones anteriores.

Pero es la forma más sencilla de enfocarse en el lado del servidor de WebSockets y tener un ejemplo funcional:

{* ../../docs_src/websockets/tutorial001.py hl[2,6:38,41:43] *}

Crear un websocket

En tu aplicación de FastAPI, crea un websocket:

{* ../../docs_src/websockets/tutorial001.py hl[1,46:47] *}

/// note | Detalles Técnicos

También podrías usar from starlette.websockets import WebSocket.

FastAPI proporciona el mismo WebSocket directamente solo como una conveniencia para ti, el desarrollador. Pero viene directamente de Starlette.

///

Esperar mensajes y enviar mensajes

En tu ruta de WebSocket puedes await para recibir mensajes y enviar mensajes.

{* ../../docs_src/websockets/tutorial001.py hl[48:52] *}

Puedes recibir y enviar datos binarios, de texto y JSON.

Pruébalo

Si tu archivo se llama main.py, ejecuta tu aplicación con:

$ fastapi dev main.py

<span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

Abre tu navegador en http://127.0.0.1:8000.

Verás una página simple como:

Puedes escribir mensajes en el cuadro de entrada y enviarlos:

Y tu aplicación FastAPI con WebSockets responderá de vuelta:

Puedes enviar (y recibir) muchos mensajes:

Y todos usarán la misma conexión WebSocket.

Usando Depends y otros

En endpoints de WebSocket puedes importar desde fastapi y usar:

  • Depends
  • Security
  • Cookie
  • Header
  • Path
  • Query

Funcionan de la misma manera que para otros endpoints de FastAPI/path operations:

{* ../../docs_src/websockets/tutorial002_an_py310.py hl[68:69,82] *}

/// info | Información

Como esto es un WebSocket no tiene mucho sentido lanzar un HTTPException, en su lugar lanzamos un WebSocketException.

Puedes usar un código de cierre de los códigos válidos definidos en la especificación.

///

Prueba los WebSockets con dependencias

Si tu archivo se llama main.py, ejecuta tu aplicación con:

$ fastapi dev main.py

<span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

Abre tu navegador en http://127.0.0.1:8000.

Ahí puedes establecer:

  • El "ID del Ítem", usado en el path.
  • El "Token" usado como un parámetro query.

/// tip | Consejo

Nota que el query token será manejado por una dependencia.

///

Con eso puedes conectar el WebSocket y luego enviar y recibir mensajes:

Manejar desconexiones y múltiples clientes

Cuando una conexión de WebSocket se cierra, el await websocket.receive_text() lanzará una excepción WebSocketDisconnect, que puedes capturar y manejar como en este ejemplo.

{* ../../docs_src/websockets/tutorial003_py39.py hl[79:81] *}

Para probarlo:

  • Abre la aplicación con varias pestañas del navegador.
  • Escribe mensajes desde ellas.
  • Luego cierra una de las pestañas.

Eso lanzará la excepción WebSocketDisconnect, y todos los otros clientes recibirán un mensaje como:

Client #1596980209979 left the chat

/// tip | Consejo

La aplicación anterior es un ejemplo mínimo y simple para demostrar cómo manejar y transmitir mensajes a varias conexiones WebSocket.

Pero ten en cuenta que, como todo se maneja en memoria, en una sola lista, solo funcionará mientras el proceso esté en ejecución, y solo funcionará con un solo proceso.

Si necesitas algo fácil de integrar con FastAPI pero que sea más robusto, soportado por Redis, PostgreSQL u otros, revisa encode/broadcaster.

///

Más información

Para aprender más sobre las opciones, revisa la documentación de Starlette para: