欢迎访问宙启技术站

使用FastAPI构建即时通讯应用程序:聊天室和实时通知功能

发布时间:2024-01-01 03:14:29

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,请查阅官方文档和示例代码。