超简单的fastapi链接websocket用例

news/2024/12/21 22:09:17/

main.py

from typing import Listfrom fastapi import FastAPI, WebSocket, WebSocketDisconnectapp = 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)@staticmethodasync 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 --reloaduvicorn.run(app='main:app', host="127.0.0.1", port=8010, reload=True, debug=True)

chat.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>聊天1</title>
</head>
<body>
<h1>User{{id}} 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:5200/api/chat/ws/user{{id}}");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>

以上部分是案例

此处是个人案例  通过http传递用户协议到jinjia2模板进行html渲染

from fastapi import APIRouter,WebSocket,WebSocketDisconnect
from app1.core.websocket_config import manager
from starlette.requests import Request
from starlette.staticfiles import StaticFiles
from starlette.templating import Jinja2Templateschat_routing=APIRouter(prefix='/chat')@chat_routing.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}-离开")templates = Jinja2Templates(directory="templates")
@chat_routing.get("/chat/{id}")
async def read_item(request: Request, id: str):return templates.TemplateResponse("chat.html", {"request": request, "id": id})

html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>聊天1</title>
</head>
<body>
<h1>User{{id}} 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:5200/api/chat/ws/user{{id}}");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>

https://www.cnblogs.com/CharmCode/p/13552551.html


http://www.ppmy.cn/news/987715.html

相关文章

DevOps(四)

CD(二) 1. CDStep 1 - 上传代码Step 2 - 下载代码Step 3 - 检查代码Step 4 - 编译代码Step 5 - 上传仓库Step 6 - 下载软件Step 7 - 制作镜像Step 8 - 上传镜像Step 9 - 部署服务2. 整体预览2.1 预览1. 修改代码2. 查看sonarqube检查结果3. 查看nexus仓库4. 查看harbor仓库5.…

【组内工作】木马回联

文章目录 C2服务器安装和运行方法CrossC2运行方法sliver运行方法empire安装方法DeimosC2安装教程TrevorC2安装教程&#xff1a; C2服务器的流量特征CrossC21. 心跳包2. 命令3. ja3/ja3s Sliver1. http2. https empirehttphttps DeimosC2https TrevorC2 C2服务器安装和运行方法 …

Windows数据类型LPSTR学习

Windows在C语言的基础之上又定义了一些Windows下的数据类型&#xff1b;下面学习一下LPSTR&#xff1b; LPSTR和LPWSTR是Win32和VC所使用的一种字符串数据类型。LPSTR被定义成是一个指向以NULL(‘\0’)结尾的32位ANSI字符数组指针&#xff0c;而LPWSTR是一个指向以NULL结尾的64…

软工导论知识框架(二)结构化的需求分析

本章节涉及很多重要图表的制作&#xff0c;如ER图、数据流图、状态转换图、数据字典的书写等&#xff0c;对初学者来说比较生僻&#xff0c;本贴只介绍基础的轮廓&#xff0c;后面会有单独的帖子详解各图表如何绘制。 一.结构化的软件开发方法&#xff1a;结构化的分析、设计、…

双指针解决n数之和问题

1. 两数之和 1. 两数之和 将时间复杂度降到O(n)&#xff1b; class Solution {// 双指针public int[] twoSum(int[] nums, int target) {int nnums.length;int l0;while(l<n){int rn-1;// 找到第一个可能nums[l]nums[r]target的位置while(r>l){if(nums[l]nums[r]targe…

LeetCode使用最小花费爬楼梯(动态规划)

使用最小花费爬楼梯&#xff08;动态规划&#xff09; 题目描述算法流程(方法一)编程代码优化代码算法流程&#xff08;方法二&#xff09;编程代码代码优化 链接: 使用最小花费爬楼梯 题目描述 算法流程(方法一) 编程代码 class Solution { public:int minCostClimbingStair…

Sestra 实用教程(二)方程求解器

目 录 一、前言二、超单元分析三、惯性释放四、模态叠加法4.1 Eigenvalue solvers4.2 Static back substitution 五、模态综合法六、Master-Slave七、参考文献 一、前言 SESAM &#xff08;Super Element Structure Analysis Module&#xff09;是由挪威船级社&#xff08;DNV-…

重学C++系列之友元

一、什么是友元 在C中&#xff0c;为了提高程序的效率&#xff0c;在一些场景下&#xff0c;引入友元&#xff0c;但同时类的封装性就会被破坏。 二、怎么实现友元 友元关键字&#xff08;friend&#xff09; // 在类中声明另一个类的成员函数来做为友元函数 // 以关键字&…