当前位置: 首页 > news >正文

FastAPI 学习之路(五十二)WebSockets(八)接受/发送json格式消息

前面我们发送的大多数都是text类型的消息,对于text消息来说,后端处理出来要麻烦的多,那么我们可以不可以传递json格式的数据,对于前后端来说都比较友好,答案是肯定的,我们需要做下处理。

首先,我们在websocket管理器中增加处理json格式消息的方法:

from typing import List, Dictfrom starlette.websockets import WebSocketclass ConnectionManager:def __init__(self):"""存放链接"""self.active_connections: List[Dict[str, WebSocket]] = []async def connect(self, user: str, ws: WebSocket):"""链接"""await ws.accept()self.active_connections.append({"user": user, "ws": ws})async def disconnect(self, user: str, ws: WebSocket):"""断开链接,移除"""self.active_connections.remove({"user": user, "ws": ws})@staticmethodasync def send_personal_message(message: str, ws: WebSocket):"""发送所有人消息"""await ws.send_text(message)async def send_other_message(self, message: dict, user: str):"""发送个人消息"""for coon in self.active_connections:if coon["user"] == user:await coon["ws"].send_json(message)async def broadcast(self, data: str):"""广播"""for conn in self.active_connections:await conn["ws"].send_text(data)async def broadcast_json(self, data: dict):"""广播json数据"""for conn in self.active_connections:await conn["ws"].send_json(data)

接口中如何接收json数据呢,新增接口如下:

@app.websocket("/ws/json/{user}")
async def websocket_json_data(websocket: WebSocket,user: str,cookie_or_token: str = Depends(get_cookie_or_token)
):"""发送接收json数据(前面一对一接口其实就是发送的json数据)"""await ws_manager.connect(user, websocket)try:while True:data = await websocket.receive_json()send_user = data["username"]if send_user:await ws_manager.send_other_message(data, send_user)else:await ws_manager.broadcast_json(data)except WebSocketDisconnect as e:await ws_manager.disconnect(user, websocket)

前端也要相对应的修改:
 

<!DOCTYPE html>
<html>
<head><title>Chat</title>
</head>
<body>
<h1>WebSocket 聊天</h1>
<form action="" onsubmit="sendMessage(event)"><input type="text" id="messageText" autocomplete="off"/><input type="text" id="username" autocomplete="off"/><button>Send</button>
</form>
<button onclick="logout()">退出</button>
<ul id='messages'>
</ul>
<script>var  token=window.localStorage.getItem("token")if (token==null ){window.location.href="/login"}var ws = new WebSocket("ws://localhost:8000/ws/json/"+token+"?token="+token);ws.onmessage = function (event) {var messages = document.getElementById('messages')var message = document.createElement('li')let receiveJson = JSON.parse(event.data);console.log(receiveJson)var content = document.createTextNode(receiveJson.username+"说:"+receiveJson.messageText)message.appendChild(content)messages.appendChild(message)};function sendMessage(event) {var input = document.getElementById("messageText")var username = document.getElementById("username")let message = {messageText: input.value, username:username.value};let messageJson = JSON.stringify(message);ws.send(messageJson);// input.value = ''event.preventDefault()}function logout() {window.localStorage.removeItem("token")window.location.href='/login'}
</script></body></html>

部署看效果,因为发送给后端的数据格式是前端拼的json,所以页面上只需要填文本即可:

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【VUE】v-if和v-for的优先级
  • Perl与数据库交互:深入理解DBI模块
  • centos(或openEuler系统)安装clickhouse集群
  • MySQL 关键字 IN 与 EXISTS 的使用与区别
  • 前端书籍翻页效果
  • 【proteus经典实战】定时器控制交通灯指示灯
  • Eureka: 微服务架构中的服务发现与注册实践
  • Python 潮流周刊#61:PyPI 管理员密钥泄露事件(摘要)
  • 【面试题】手撕缓存LRU
  • 开放开源开先河(三)
  • python需要掌握那些语法
  • 【Mysql关于读已提交和可重复读(Read Committed)隔离级别下解决幻读的方案】
  • python--实验15 数据分析与可视化
  • Python爬虫——1爬虫基础(一步一步慢慢来)
  • 【golang-ent】go-zero框架 整合 ent orm框架 | 解决left join未关联报错的问题
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 《Java编程思想》读书笔记-对象导论
  • 【Linux系统编程】快速查找errno错误码信息
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • AHK 中 = 和 == 等比较运算符的用法
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Linux快速复制或删除大量小文件
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MySQL-事务管理(基础)
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Python进阶细节
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 简单易用的leetcode开发测试工具(npm)
  • 三栏布局总结
  • 深入 Nginx 之配置篇
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 回归生活:清理微信公众号
  • !!java web学习笔记(一到五)
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #Linux(make工具和makefile文件以及makefile语法)
  • #每日一题合集#牛客JZ23-JZ33
  • #知识分享#笔记#学习方法
  • (2022 CVPR) Unbiased Teacher v2
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (floyd+补集) poj 3275
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (十) 初识 Docker file
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (五)activiti-modeler 编辑器初步优化
  • (转载)Google Chrome调试JS
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .Net Remoting常用部署结构
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net分布式压力测试工具(Beetle.DT)