From 26da9259ea476f17e43bb966d49a9a41559063eb Mon Sep 17 00:00:00 2001 From: marys Date: Tue, 30 Sep 2025 13:28:58 +0200 Subject: [PATCH] FastAPI-websocket, two channels --- html/index.html | 58 +++++++++++++++++++++++++-------------- server.py | 73 ++++++++++++++++++++++--------------------------- 2 files changed, 70 insertions(+), 61 deletions(-) diff --git a/html/index.html b/html/index.html index c909c40..8345e99 100644 --- a/html/index.html +++ b/html/index.html @@ -5,37 +5,53 @@

WebSocket Chat

+

Your ID:

- - - -
- + +
+ +
+ Channel 1 + Channel 2 + - + \ No newline at end of file diff --git a/server.py b/server.py index 3162180..09580ad 100644 --- a/server.py +++ b/server.py @@ -1,71 +1,50 @@ +import logging + from fastapi import FastAPI, WebSocket, WebSocketDisconnect from fastapi.responses import HTMLResponse +logging.basicConfig( + level=logging.DEBUG, # Use DEBUG or INFO for dev + format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", +) +logger = logging.getLogger(__name__) app = FastAPI() -html = """ - - - - Chat - - -

WebSocket Chat

-

Your ID:

-
- - -
- - - - -""" - class ConnectionManager: def __init__(self): self.active_connections: list[WebSocket] = [] + self.logger = logging.getLogger(self.__class__.__name__) async def connect(self, websocket: WebSocket): await websocket.accept() + self.logger.info("connect") self.active_connections.append(websocket) def disconnect(self, websocket: WebSocket): + self.logger.info("disconnect") self.active_connections.remove(websocket) async def send_personal_message(self, message: str, websocket: WebSocket): - await websocket.send_text(message) + self.logger.info("send_personal_message") + print(f"send_personal_message: {message}") + await websocket.send_text(f"personal: {message}") async def broadcast(self, message: str): + self.logger.info("broadcast") for connection in self.active_connections: await connection.send_text(message) manager = ConnectionManager() - +manager2 = ConnectionManager() @app.get("/") async def get(): - return HTMLResponse(html) + with open("html/index.html") as html_index: + html = html_index.read() + return HTMLResponse(html) @app.websocket("/ws/{client_id}") @@ -74,8 +53,22 @@ async def websocket_endpoint(websocket: WebSocket, client_id: int): try: while True: data = await websocket.receive_text() + logger.info(f"channel 1: {data}") await manager.send_personal_message(f"You wrote: {data}", websocket) await manager.broadcast(f"Client #{client_id} says: {data}") except WebSocketDisconnect: manager.disconnect(websocket) await manager.broadcast(f"Client #{client_id} left the chat") + +@app.websocket("/ws1/{client_id}") +async def websocket_endpoint1(websocket: WebSocket, client_id: int): + await manager2.connect(websocket) + try: + while True: + data = await websocket.receive_text() + logger.info(f"channel 2: {data}") + await manager2.send_personal_message(f"You wrote: {data}", websocket) + await manager2.broadcast(f"Client #{client_id} says: {data}") + except WebSocketDisconnect: + manager2.disconnect(websocket) + await manager2.broadcast(f"Client #{client_id} left the chat")