FastAPI WebSocket 基本使用一


FastAPI WebSocket 簡單演示

下午沒事看了看WebSocket,感覺這個挺好玩的,比寫CRUD有意思。就復制了官網的demo演示看了看。

官方文檔 https://fastapi.tiangolo.com/advanced/websockets/

效果

簡單效果演示

WebSocket 服務

使用Python FastAPI框架官網demo

from typing import List

from fastapi import FastAPI, WebSocket, WebSocketDisconnect

app = FastAPI()


class ConnectionManager:
    def __init__(self):
        # 存放激活的ws連接對象
        self.active_connections: List[WebSocket] = []

    async def connect(self, ws: WebSocket):
        # 等待連接
        await ws.accept()
        # 存儲ws連接對象
        self.active_connections.append(ws)

    def disconnect(self, ws: WebSocket):
        # 關閉時 移除ws對象
        self.active_connections.remove(ws)

    @staticmethod
    async def send_personal_message(message: str, ws: WebSocket):
        # 發送個人消息
        await ws.send_text(message)

    async def broadcast(self, message: str):
        # 廣播消息
        for connection in self.active_connections:
            await connection.send_text(message)


manager = ConnectionManager()


@app.websocket("/ws/{user}")
async def websocket_endpoint(websocket: WebSocket, user: str):

    await manager.connect(websocket)

    await manager.broadcast(f"用戶{user}進入聊天室")

    try:
        while True:
            data = await websocket.receive_text()
            await manager.send_personal_message(f"你說了: {data}", websocket)
            await manager.broadcast(f"用戶:{user} 說: {data}")

    except WebSocketDisconnect:
        manager.disconnect(websocket)
        await manager.broadcast(f"用戶-{user}-離開")

if __name__ == "__main__":
    import uvicorn
    # 官方推薦是用命令后啟動 uvicorn main:app --host=127.0.0.1 --port=8010 --reload
    uvicorn.run(app='main:app', host="127.0.0.1", port=8010, reload=True, debug=True)

前端

前端只是簡單使用演示, 沒有對連接做鑒權處理。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>聊天1</title>
</head>
<body>
<h1>User1 Chat</h1>
<form action="" onsubmit="sendMessage(event)">
    <input type="text" id="messageText" autocomplete="off"/>
    <button>Send</button>
</form>
<ul id='messages'>
</ul>

<script>
    var ws = new WebSocket("ws://127.0.0.1:8010/ws/user1");

    ws.onmessage = function(event) {
        var messages = document.getElementById('messages')
        var message = document.createElement('li')
        var content = document.createTextNode(event.data)
        message.appendChild(content)
        messages.appendChild(message)
    };
    function sendMessage(event) {
        var input = document.getElementById("messageText")
        ws.send(input.value)
        input.value = ''
        event.preventDefault()
    }
</script>

</body>
</html>

用戶2, 和上面的用戶1沒什么區別,只是連接WebSocket 參數變化區分,
其他地方一樣,就是url參數變化了。

<script>
    var ws = new WebSocket("ws://127.0.0.1:8010/ws/user2");

    ws.onmessage = function(event) {
        var messages = document.getElementById('messages')
        var message = document.createElement('li')
        var content = document.createTextNode(event.data)
        message.appendChild(content)
        messages.appendChild(message)
    };
    function sendMessage(event) {
        var input = document.getElementById("messageText")
        ws.send(input.value)
        input.value = ''
        event.preventDefault()
    }
</script>

總結

WebSocket使用還是很簡單的,但是封裝鑒權,前端斷線重連等等操作還是很耗時的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM