• 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使用还是很简单的,但是封装鉴权,前端断线重连等等操作还是很耗时的。

  • 相关阅读:
    iOS学习-UILabel
    react js
    代理模式
    利用gitbush从git上下载代码到本地
    VS2017企业版密钥
    office2016产品密钥及激活工具
    .netframe初识
    树的遍历——c#实现
    数据结构——总结
    单例模式
  • 原文地址:https://www.cnblogs.com/CharmCode/p/13552551.html
Copyright © 2020-2023  润新知