FastAPI是一个现代、快速(高性能)的Web框架,用于构建API和Web应用程序。它建立在Starlette的基础上,提供了简单易用的语法和强大的性能。
要构建一个即时通讯应用程序,包括聊天室和实时通知功能,我们可以使用FastAPI的WebSocket功能和异步事件处理。下面是一个使用FastAPI构建即时通讯应用程序的示例:
from fastapi import FastAPI, WebSocket from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles from typing import List from pydantic import BaseModel from starlette.websockets import WebSocketDisconnect import uvicorn # 创建FastAPI应用程序 app = FastAPI() # 声明静态文件目录 app.mount("/static", StaticFiles(directory="static"), name="static") # 用于存储连接的WebSocket客户端 websocket_clients = [] # WebSocket消息模型 class Message(BaseModel): sender: str text: str # WebSocket路由 @app.websocket("/ws/{client_id}") async def websocket_endpoint(websocket: WebSocket, client_id: int): await websocket.accept() try: while True: # 从客户端接收消息 data = await websocket.receive_json() # 构建消息对象 message = Message(**data) # 将消息广播给所有客户端 for client in websocket_clients: try: await client.send_json(message) except: # 从连接列表中移除断开的客户端 websocket_clients.remove(client) except WebSocketDisconnect: # 客户端断开连接时,从连接列表中移除断开的客户端 websocket_clients.remove(websocket) # 首页路由 @app.get("/", response_class=HTMLResponse) async def get(): return """ <!DOCTYPE html> <html> <head> <title>Chat Room</title> <script> // 创建WebSocket连接 var ws = new WebSocket("ws://localhost:8000/ws/1"); // 监听WebSocket连接事件 ws.onopen = function(event) { console.log("WebSocket connected"); }; // 监听WebSocket消息事件 ws.onmessage = function(event) { var message = JSON.parse(event.data); console.log("Received message:", message); // 处理消息,例如将消息显示在聊天界面上 }; // 监听WebSocket断开连接事件 ws.onclose = function(event) { console.log("WebSocket disconnected"); }; // 发送消息到服务器 function sendMessage() { var sender = document.getElementById("sender").value; var text = document.getElementById("text").value; ws.send(JSON.stringify({ "sender": sender, "text": text })); // 清空输入框 document.getElementById("text").value = ""; } </script> </head> <body> <input id="sender" type="text" placeholder="Your name"> <input id="text" type="text" placeholder="Type a message"> <button type="button" onclick="sendMessage()">Send</button> </body> </html> """ if __name__ == "__main__": uvicorn.run(app, host="localhost", port=8000)
上述示例中,WebSocket路由/ws/{client_id}用于处理客户端与服务器之间的WebSocket连接。当有新的连接建立时,服务器将接受WebSocket并开始处理消息。然后,服务器将从客户端接收到的消息广播给所有连接的客户端。
首页路由/返回一个包含聊天界面的HTML响应。在客户端的JavaScript代码中,我们创建了一个WebSocket连接,并在不同事件上注册了相应的处理函数。这样,当服务器发送消息时,我们可以在控制台中看到接收到的消息,并且我们可以通过输入框和按钮来发送消息。
这个示例仅展示了一个简单的聊天室。你可以根据你的需求扩展该应用程序,例如添加认证和授权、保存聊天记录、显示在线用户列表等。
希望这个示例可以帮助你开始使用FastAPI构建一个即时通讯应用程序,提供聊天室和实时通知功能。如果你想要进一步了解FastAPI和WebSocket,请查阅官方文档和示例代码。