Flask框架-1-[群聊]: flask-socketio实现websocket的功能

一、项目结构

flask_websocket

        |---static

                |---js

                        |---jquery-3.7.0.min.js

                        |---socket.io_4.3.1.js

        |---templates

                |---home

                        |---group_chat.html

                        |---index.html

        |---app.py

1.1、python环境

python3.9.0

1.2、依赖包

Flask==2.1.0
eventlet==0.33.3
Flask-SocketIO==5.3.4

1.3、js文件下载

https://code.jquery.com/jquery-3.7.0.min.js

https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.3.1/socket.io.min.jsicon-default.png?t=N7T8https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.3.1/socket.io.min.js

二、非群聊功能

概述:项目中使用websocket,无法是为了实现实时更新数据。在某些数据上,需要能够实时更新数据或需要服务端主动向客户端推送更新的数据。

2.1、前端index.html

<!DOCTYPE html>
<html>
<head><script src="/static/js/socket.io_4.3.1.js"></script><script src="/static/js/jquery-3.7.0.min.js"></script><script type="text/javascript">var socket = io({query:{'token':'123456'}});// 1、接收服务器端,给connect事件的响应,token验证成功服务器端才允许连接socket.on('success', function(message) {// 处理从服务器接收到的响应数alert(message)});//2、 接收来自服务器的'handle_data'事件,返回的数据socket.on('handle_data', function(message) {console.log(message)// 处理从服务器接收到的响应数const msg = message.msg;const $showDiv = $('#show');const pElement = $('<p>').text(msg);//添加到展示的div标签中$showDiv.append(pElement);});//3、 发送'handle_data'事件给服务器dfunction sendMessage() {var message = {"type":"user","id":1};//向后端获取id=1的用户的数据socket.emit('handle_data',message); //可以直接返回字典等数据}</script>
</head>
<body><div id="show"></div><button onclick="sendMessage()">Send Message</button></body>
</html>

2.2、后端相关接口,app.py

from flask import Flask,render_template,request,jsonify
from flask_socketio import SocketIO,send,emit,join_roomapp = Flask(__name__,static_folder='./static',template_folder='./templates')
socketio = SocketIO(app,cors_allowed_origins='*')'''
一、非群聊功能,前端需要实时更新某些数据使用
1、返回html页面
2、主动发送websocket到后端,后端返回数据给请求的用户
3、调用某个视图函数,在视图函数中,给所有连接推送新的数据
'''@app.route('/')
def index():return render_template('home/index.html')@app.route('/user')
def user():# 给房间名中的所有websocket,广播数据,告知所有连接去获取新的数据,socketio.emit('handle_data', {'data': '返回的数据', 'type': 'user', 'msg': '数据更新,广播到房间中返回的数据'}, room='default')return jsonify({'code': 200, 'data':'update data success!!!'})@socketio.on('handle_data')
def handle_data(data):print(data,'接收浏览器发送的数据')#1、给发送给后端的websocket,发送数据,单独给这个websocket发送# socketio.emit('handle_data', {'data':'返回的数据','type':'user','msg':'单独返回'})emit('handle_data',{'data':'返回的数据','type':'user','msg':'主动请求时,返回的数据'})@socketio.on('connect')
def handle_connect():print('connect连接')token = request.args.get('token')sid = request.sidprint(request.args,'args')# print('连接的sid',request.sid)if token == '123456':socketio.emit('success','验证token成功')join_room('default') #加入到默认的房间中了#表明连接成功else:print('token验证失败')#阻止连接return Falseif __name__ == '__main__':socketio.run(app,debug=True)

2.3、功能测试

1、访问:http://127.0.0.1:5000 ,在发起连接时,传递了token,token验证成功才能建立连接

2、点击 Send Message,模拟前端主动向后端发送信息,如获取指定数据,后端再返回指定数据

3、新开一个标签访问:http://127.0.0.1:5000/user,模拟操作某些接口后,数据发生了变化,服务端主动将更新后的数据发给前端

三、群聊功能

概述:在web端实现群聊功能,实时收发消息。

3.1、前端group_chat.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>群聊</title><script type="application/javascript" src="/static/js/jquery-3.7.0.min.js"></script><script type="application/javascript" src="/static/js/socket.io_4.3.1.js"></script><script type="application/javascript">//传递给模板的数据,转成python数据结构const data = {{ data|tojson }};const group = data.group; //群名const name = data.name;//当前用户名//1、发起连接const socket = io('http://'+document.domain+':'+location.port+'/chat',{query:{'token':'123456','group':group,'name':name}});//2、监控群里中的消息socket.on('group_recv',function (data) {const msg = data.msg; //群里的消息const sendName = data.name; //发消息的人const sendType = data.type; //消息的类型const showDiv = $('#showDataId'); //展示消息的区域console.log(data)if (sendType==='connect'){//有人进入群里if (name===sendName){const pElement = $('<p>').text('欢迎您进入 '+group+' 群聊....');//添加到展示的div标签中showDiv.append(pElement);}else {const pElement = $('<p>').text('热烈欢迎'+sendName+'进入群聊....');//添加到展示的div标签中showDiv.append(pElement);}}else if (sendType==='data'){//有人群里发消息if (name===sendName){const pElement = $('<p>').text(msg);//添加到展示的div标签中showDiv.append(pElement);} else {const pElement = $('<p>').text(sendName+'> '+msg);//添加到展示的div标签中showDiv.append(pElement);}}else {//有人退出群里if (name === sendName) {} else {const pElement = $('<p>').text('公告: ' + sendName + '退出群里...');//添加到展示的div标签中showDiv.append(pElement);}}});//3、发送消息function sendDataFunc() {const $sendData = $('#sendDataId');socket.emit('group',{'group':group,'msg':$sendData.val(),'name':name});}</script>
</head>
<body>{#1、展示群聊的消息#}
<div id="showDataId"></div>{#2、发送消息的输入框#}
<div><input id="sendDataId" type="text"><input type="button" value="发送消息" onclick="sendDataFunc()">
</div></body>
</html>

3.2、后端相关接口

from flask import Flask,render_template,request,jsonify
from flask_socketio import SocketIO,send,emit,join_roomapp = Flask(__name__,static_folder='./static',template_folder='./templates')
socketio = SocketIO(app,cors_allowed_origins='*')''' 
二、群聊相关的:使用名称空间=/chat 
1、返回html页面的,地址栏中提取用户名和群名
2、后端接收js发送的消息,给群广播消息
'''
@app.route('/group/chat')
def group_chat():group = request.args.get('group')name = request.args.get('name')return render_template('home/group_chat.html',data={'group':group,'name':name})@socketio.on('connect',namespace='/chat')
def chat_connect():'''控制群里用户进入群连接:return:'''token = request.args.get('token')name = request.args.get('name')group = request.args.get('group')print('群聊的连接:',request.args)if token:join_room(group)emit('group_recv',{'name':name,'msg':f'进入’{group}‘群聊','type':'connect'},room=group)else:return False@socketio.on('group',namespace='/chat')
def handle_group(data):''':param data: 用户在群聊中发送消息:return:'''print('chat群里发消息:',data)group = data.get('group')msg = data.get('msg')name = data.get('name')ret_data = {'msg':msg,'name':name,'type':'data'}emit('group_recv',ret_data,room=group)if __name__ == '__main__':socketio.run(app,debug=True)

3.3、功能测试

1、新开一个标签,访问:http://127.0.0.1:5000/group/chat?group=chat1&name=lhz

2、新开一个标签,访问: http://127.0.0.1:5000/group/chat?group=chat1&name=yf

3、新开一个标签,访问:http://127.0.0.1:5000/group/chat?group=chat1&name=zzh

4、在任意一个输入框中输入信息并发送

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/137036.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gpt扣款失败,openai扣款失败无法使用-如何解决gpt扣款失败的问题?

gpt扣款失败&#xff0c;openai扣款失败无法使用。毕竟你花了钱却无法使用你所期待的服务&#xff0c;这种情况确实令人不快。但是&#xff0c; 为什么gpt扣款失败&#xff1f; 可能是由于支付问题导致的扣款失败。这包括信用卡额度不足、支付信息错误等等。如果你的支付信息…

NI SCXI-1520 控制主板模块

NI SCXI-1520 是 National Instruments&#xff08;NI&#xff09;生产的控制主板模块&#xff0c;通常用于 NI 的 SCXI&#xff08;Signal Conditioning eXtensions for Instrumentation&#xff09;模块化测量和控制系统中&#xff0c;以实现信号调理、数据采集和控制。以下是…

问道管理:机器人产业迎催化 黄金价格或将突破前高

昨日&#xff0c;沪指盘中震动下探&#xff0c;一度跌近1%逼近3100点&#xff0c;尾盘逐步止跌&#xff1b;深成指、创业板指均跌超1%。截至收盘&#xff0c;沪指跌0.45%报3123.07点&#xff0c;深成指跌1.14%报10255.87点&#xff0c;创业板指跌1.14%报2027.73点&#xff0c;科…

全局异常处理器@RestControllerAdvice解析 Springboot项目异常处理 JavaWeb @ExceptionHandler

RestControllerAdvice public class GlobalExceptionHandler {ExceptionHandler(Exception.class)//指定捕获异常类型:所有public Result ex(Exception ex){ex.printStackTrace();return Result.error("对不起,出现异常,请联系管理员");}}RestControllerAdvice注解在…

淘宝商品详情数据采集

淘宝商品详情数据采集的方法如下&#xff1a; 确定采集目标&#xff1a;明确要采集的商品信息&#xff0c;如商品标题、价格、销量、评论、图片等。选择采集工具&#xff1a;可以选择Scrapy框架、Java的WebMagic框架等。编写爬虫程序&#xff1a;进入目标文件夹&#xff0c;输…

起尔正版虚拟商品交易商城源码系统 第三方交易平台网站源码

起尔网正版虚拟商品交易商城源码系统 Thinkct多商户源码系统商城&#xff0c;采用Thinkphp框架打造&#xff0c;后端采用Thinkadmin开发响应速度控制200ms内 起尔网正版虚拟商品交易商城源码系统 - 起尔网起尔网正版虚拟商品交易商城源码系统 Thinkct多商户源码系统商城&#…

数据结构和算法(7):图应用

双连通分量&#xff1a;判定准则 考查无向图G。若删除顶点v后G所包含的连通域增多&#xff0c;则v称作切割节点或关节点。 不含任何关节点的图称作双连通图。 任一无向图都可视作由若干个极大的双连通子图组合而成&#xff0c;这样的每一子图都称作原图的一个双连通域。 如何…

HTML实现移动端布局与页面自适应

我们所说的布局方式&#xff0c;这里我们通常指的是width和height在不同页面情况下面的改变。 常见页面的布局方式有 静态布局 &#xff08;px布局&#xff0c;就是固定其高宽&#xff0c;不论页面怎样放大缩小&#xff0c;其占领的依旧是&#xff0c;使用px固定了的高宽&…

JumpServer开源堡垒机与爱可生云树数据库完成兼容性认证

近日&#xff0c;中国领先的开源软件提供商FIT2CLOUD飞致云宣布&#xff0c;JumpServer开源堡垒机已经完成与爱可生云树数据库软件的兼容性认证。经过双方联合测试&#xff0c;云树数据库软件&#xff08;简称&#xff1a;ActionDB&#xff09;V1.0与杭州飞致云信息科技有限公司…

Java下打印九九乘法表

这个算法是基于打直角三角型演变而来&#xff0c;代码如下&#xff1a; public class MyWork {public static void main(String[] args) {for (int i 1; i < 10; i) {for (int j 1; j < i; j) {System.out.print(j "x" i "" i*j "\t&qu…

阿里云服务器开放的一个新端口,重启防火墙,端口未启动

问题&#xff1a; 阿里云网页开放的一个新端口后&#xff0c;重启防火墙&#xff0c;端口未启动&#xff0c;之前配置的也都停止了。 解决&#xff1a; 原因可能是阿里的服务控制了&#xff0c;只能一个个端口开启了。把新配置新端口也单独启用。 开启80端口指令 firewall-cm…

SqlServer在尝试加载程序集 ID 65917 时 Microsoft .NET Framework 出错。服务器可能资源不足,或者不信任该程序集

问题&#xff1a;在尝试加载程序集 ID 65917 时 Microsoft .NET Framework 出错。服务器可能资源不足&#xff0c;或者不信任该程序集&#xff0c;因为它的 PERMISSION_SET 设置为 EXTERNAL_ACCESS 或 UNSAFE。 检查数据库属性&#xff1a;检查服务器是否信任该程序集 解决方法…

数据分析回头看2——重复值检查/元素替换/异常值筛选

0、前言&#xff1a; 这部分内容是对Pandas的回顾&#xff0c;同时也是对Pandas处理异常数据的一些技巧的总结&#xff0c;不一定全面&#xff0c;只是自己在数据处理当中遇到的问题进行的总结。 1、当数据中有重复行的时候需要检测重复行&#xff1a; 方法&#xff1a;使用p…

Android 12 源码分析 —— 应用层 五(SystemUI的StatusBar类的启动过程和三个窗口的创建)

Android 12 源码分析 —— 应用层 五&#xff08;SystemUI的StatusBar类的启动过程和三个窗口的创建&#xff09; 更新历史日期内容12023-9-18修改关于mLightsOutNotifController的错误注释 在前面的文章中&#xff0c;我们介绍了SystemUI App的基本布局和基本概念。接下来&a…

《PostgreSQL与NoSQL:合作与竞争的关系》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

【AI】机器学习——支持向量机(线性模型)

支持向量机是一种二分类算法&#xff0c;通过在高维空间中构建超平面实现对样本的分类 文章目录 5.1 SVM概述5.1.1 分类 5.2 线性可分SVM5.2.1 线性可分SVM基本思想5.2.2 策略函数间隔几何间隔硬间隔最大化 5.2.3 原始算法支持向量 5.2.4 对偶形式算法1. 构造并求解对偶问题2. …

帝国EmpireCMS_7.5_SC_UTF8漏洞复现

一、漏洞说明 EmpireCMS 7.5版本及之前版本在后台备份数据库时&#xff0c;未对数据库表名做验证&#xff0c;通过修改数据库表名 二、搭建环境 下载地址&#xff1a;http://www.phome.net/download/ 然后执行&#xff1a;http://127.0.0.1/EmpireCMS_7.5_SC_UTF8/upload/e/ins…

安卓内部存储不需要申请权限,外部文件需要申请权限

内部存储和外部存储的访问权限区别&#xff1a; 内部路径&#xff1a;/data/user/0/com.xxx.xxx/ getExternalFilesDir可以获取到属于 App 自身的文件路径&#xff0c;通常是~/Android/data/<package-name>/**/。在该目录中读写文件均不需要申请权限,随着APP卸载就会删…

暨南大学旅游管理《乡村振兴战略下传统村落文化旅游设计》许少辉校友——2023学生开学季辉少许

暨南大学旅游管理《乡村振兴战略下传统村落文化旅游设计》许少辉校友——2023学生开学季辉少许

【系统美化】快速打开鼠标样式切换的对话框

从 间谍过家家阿尼亚鼠标指针 v19 这个网址下载的鼠标样式中,提取出这样一句: rundll32.exe shell32.dll,Control_RunDLL main.cpl终于费劲巴力的找到快速打开鼠标样式对话框的方式了。 方法1:windows R 打开运行 main.cpl 0,1方法2:创建桌面快捷方式 桌面->右键->创…