Creando una Aplicación Web Interactiva Usando FastAPI, React y WebSockets

Tiempo de lectura: 3 minutos

Aprender a construir una aplicación web en tiempo real, utilizando FastAPI para el backend y React con WebSockets para el frontend. Esta app permitirá a los usuarios interactuar en tiempo real, mostrando cómo integrar tecnología moderna en un flujo de trabajo eficiente.

Mar acantilados - Pexels

Requisitos Previos

  • Conocimiento intermedio de Python.
  • Conocimiento intermedio de JavaScript/TypeScript y React.
  • Familiaridad con WebSockets.
  • Conocimiento básico de la terminal y herramientas como npm y pip.

Paso 1: Configuración del Entorno Backend (FastAPI + WebSockets)

Instalar FastAPI y Uvicorn

FastAPI es un framework rápido de Python para la creación de APIs. Vamos a usarlo para gestionar las conexiones WebSocket.

pip install fastapi uvicorn

Configurar el servidor WebSocket en FastAPI

Creamos un archivo main.py para definir el servidor y gestionar las conexiones de WebSocket:

from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.responses import HTMLResponse

app = FastAPI()

# Manejador de conexión WebSocket
class ConnectionManager:
    def __init__(self):
        self.active_connections: list[WebSocket] = []

    async def connect(self, websocket: WebSocket):
        await websocket.accept()
        self.active_connections.append(websocket)

    async def disconnect(self, websocket: WebSocket):
        self.active_connections.remove(websocket)

    async def send_personal_message(self, message: str, websocket: WebSocket):
        await websocket.send_text(message)

    async def broadcast(self, message: str):
        for connection in self.active_connections:
            await connection.send_text(message)

manager = ConnectionManager()

@app.get("/")
def get():
    return HTMLResponse("""
        <html>
            <head>
                <title>WebSocket Chat</title>
            </head>
            <body>
                <h1>Welcome to the WebSocket Chat!</h1>
                <div id="messages"></div>
                <input id="messageInput" type="text" placeholder="Type a message...">
                <button id="sendButton">Send</button>

                <script>
                    const ws = new WebSocket("ws://localhost:8000/ws/chat");
                    const messagesDiv = document.getElementById("messages");
                    const input = document.getElementById("messageInput");
                    const sendButton = document.getElementById("sendButton");

                    ws.onmessage = function(event) {
                        const message = document.createElement("div");
                        message.textContent = event.data;
                        messagesDiv.appendChild(message);
                    };

                    sendButton.onclick = function() {
                        ws.send(input.value);
                        input.value = '';
                    };
                </script>
            </body>
        </html>
    """)

@app.websocket("/ws/chat")
async def websocket_endpoint(websocket: WebSocket):
    await manager.connect(websocket)
    try:
        while True:
            data = await websocket.receive_text()
            await manager.broadcast(data)
    except WebSocketDisconnect:
        manager.disconnect(websocket)

En este código:

  • FastAPI maneja las conexiones WebSocket.
  • ConnectionManager gestiona las conexiones activas y envía mensajes a todos los clientes conectados.

Ejecutar el servidor FastAPIuvicorn main:app --reload

uvicorn main:app --reload

El servidor estará escuchando en http://localhost:8000. Y podremos acceder a él.

Paso 2: Configuración del Entorno Frontend (React + WebSockets)

Crear la Aplicación React

Usamos create-react-app para crear la base del proyecto React:

npx create-react-app websocket-chat --template typescript
cd websocket-chat

Instalar Dependencias

Asegúrate de tener WebSocket disponible en el frontend:

npm install --save websocket

Configurar WebSocket en React

Crea un componente Chat.tsx para gestionar la conexión WebSocket y la interfaz de usuario.

import React, { useEffect, useRef, useState } from 'react';

const Chat: React.FC = () => {
    const [message, setMessage] = useState<string>('');
    const [messages, setMessages] = useState<string[]>([]);
    const ws = useRef<WebSocket | null>(null);

    useEffect(() => {
        ws.current = new WebSocket('ws://localhost:8000/ws/chat');
        ws.current.onmessage = (event) => {
            setMessages((prevMessages) => [...prevMessages, event.data]);
        };

        return () => {
            if (ws.current) {
                ws.current.close();
            }
        };
    }, []);

    const sendMessage = () => {
        if (ws.current) {
            ws.current.send(message);
            setMessage('');
        }
    };

    return (
        <div>
            <h1>WebSocket Chat</h1>
            <div>
                {messages.map((msg, index) => (
                    <div key={index}>{msg}</div>
                ))}
            </div>
            <input
                type="text"
                value={message}
                onChange={(e) => setMessage(e.target.value)}
            />
            <button onClick={sendMessage}>Send</button>
        </div>
    );
};

export default Chat;

En este componente:

  • useEffect establece y limpia la conexión WebSocket.
  • useRef mantiene la conexión abierta durante el ciclo de vida del componente.
  • Se actualiza el estado messages para mostrar los mensajes recibidos.

Usar el Componente en la Aplicación

Edita App.tsx para usar el componente Chat.

import React from 'react';
import Chat from './Chat';

const App: React.FC = () => {
    return (
        <div className="App">
            <Chat />
        </div>
    );
};

export default App;

Ejecutar la Aplicación React

npm start

Esto iniciará el servidor de desarrollo de React en http://localhost:3000, donde podrás interactuar con la app en tiempo real.

Paso 3: Interacción en Tiempo Real

Abre el navegador en dos o más pestañas o en dispositivos diferentes para probar cómo los mensajes se envían en tiempo real.

Cuando un usuario envía un mensaje, todos los demás usuarios verán el mensaje al instante sin necesidad de recargar la página.

Deja un comentario