FastAPI WebSocket 基本使用一

摘要:
FastAPI WebSocket是一个简单的演示。我下午看到了WebSocket。我觉得很有趣。这比编写CRUD更有趣。正式文件https://fastapi.tiangolo.com/advanced/websockets/效果WebSocket服务使用Python FastAPI框架官方网站demofromtypengimportListfromfastapiimportFastAPI,WebSocket,WebSocketDisconnectapp=FastAPI()classConnectionManager:def__init__:#存储活动的ws连接对象self.active_connections:List[WebSocket]=[]asyncdefconnect:#等待连接激活ws。accept()#存储ws连接对象自身。active_连接。appenddefdisconnect:#关闭时删除ws对象self.active_connections.remove@staticmethodasyncdefsend_personal_message:#发送个人消息awaitws.Send _ Textasyncdefbroadcast:#连接自身的广播消息。active_ connections:awaitconnection.send _ textmanager=ConnectionManager()@app.websocketasyncdefwebsocket _ endpoint:awaitmanager.connectawaitmanager。broadcasttry:whileTrue:data=awaitwebsocket.receive _ text()awaitmanager.send _ personal _ messageawaitmanager.broadcastexceptWebSocketDisconnect:manager.disconnectawaitmanager.broadcastif__ name __=“__main__”:Importuvicorn#官方建议使用命令启动uvicornmain:app--host=127.0.0.1--port=8010--reloaduvicorn。run前端的前端只是一个简单的演示,并不验证连接。
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"   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使用还是很简单的,但是封装鉴权,前端断线重连等等操作还是很耗时的。

免责声明:文章转载自《FastAPI WebSocket 基本使用一》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oracle执行计划详解WPF使ListBox支持手势多选功能下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

移动端双指缩放图片JS事件的实践心得

一、Chrome浏览器双指触摸的模拟 结果是模拟不了。 页面整体缩放行为是可以通过按住Shift键+页面左键模拟的,但是,实际上,还是一个触摸点,因此无法模拟双指缩放行为。 除非是有触摸板,或者屏幕就是触摸屏。 否则,只能连手机进行调试了。 二、触摸屏与event.touches 在触屏设备下,要判断是单指还是多指操作,可以通过 event.touches...

QT基础三

4.1The Central Widget QMainWindow的中央区域可以被任何类型的widget占据。 4.2Subclassing QTableWidget QTableWidget会自动创建QTableWidgetItem来存储用户的输入。 QTableWidgetItem类并不是widget,而是一个纯粹的data class。 QTabeW...

WebSocket 实现长连接演示代码

服务端代码(node) const WebSocket = require('ws') const ws = new WebSocket.Server({ port: 8080 },()=>{ console.log('socket start') }) // 创建服务器 // 连接监听 clinet表示已经连接的客户端对象有多个 let...

nginx反向代理 支持WebSocket

WebSocket(简称WS)协议的握手和HTTP是兼容的,通过HTTP/1.1中协议转换机制,客户端可以传递名为“Upgrade” 头部信息将连接从HTTP连接升级到WebSocket连接 那么反向代理服务器怎么样支持WS协议呢? “Upgrade” 使用的是hop-by-hop(逐跳首部)机制,正向代理时客户端可以使用“CONNECT”方法解决,但是客...

Flume简介及安装

Hadoop业务的大致开发流程以及Flume在业务中的地位: 从Hadoop的业务开发流程图中可以看出,在大数据的业务处理过程中,对于数据的采集是十分重要的一步,也是不可避免的一步,从而引出我们本文的主角—Flume。 Flume概念 flume是分布式的日志收集系统,它将各个服务器中的数据收集起来并送到指定的地方去,比如说送到图中的HDFS,简单来...

[Openfire]使用WebSocket建立Openfire的客户端

近日工作闲暇之余,对IM系统产生了兴趣,转而研究了IM的内容。找了半天,知道比较流行的是Openfire的系统,Openfire有许多平台实现,由于我是做Web的,所以当然是希望寻找Web的实现。Openfire的以前的Web实现,是基于Http-bind的一种长轮询机制,当然也没什么不好,只是我现在HTML5都开始了,当然希望能够来个基于Websock...