flask使用websocket
flask使用websocket
1.概述
flask实现websocket有两种方式:flask_sockets,Flask-SocketIO。
flask_sockets:该方式是flask对websocket的最原始封装,功能较为单一;
Flask-SocketIO:该方式所能提供功能较多,不但实现了socket的基本通信功能,也可以结合flask相关接口,使其更加完备。
2.flask-sockets实验
2.1 环境配置
安装flask-sockets包,版本0.2.1
pip install flask-sockets
2.2 后端
2.2.1 route
路由包括两部分,其一为页面路由,其二为后台数据交换路由。
def handle_route_websocket_simple(app):
@app.route('/ws/test_1')
def page_ws_test_1():
return render_template('websocket_test.html', title="websocket test")
# websocket
def handle_route_websocket(app_socket):
@app_socket.route('/ws/test_2')
def page_websocket_test(ws):
now = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time()))
while not ws.closed:
# 回传给clicent
message = ws.receive() # 接收到消息
if message is not None:
print("client says(%s): %s" %(now, message))
ws.send(str("回执:server已收到消息!-- %s " % now))
ws.send(str(json.dumps(message))) # 回传给clicent
else:
print(now, "no receive")
添加路由是用方法完成的,后面两句是看一下路由映射关系。
# websocket页面
from flask_sockets import Sockets
app_socket = Sockets(app)
from .routes import handle_route_websocket, handle_route_websocket_simple
handle_route_websocket_simple(app)
handle_route_websocket(app_socket)
print(app_socket.url_map)
print(app.url_map)
路由映射关系:
Map([<Rule '/ws/test_2' -> <function handle_route_websocket.<locals>.page_websocket_test at 0x0000009D88A83620>>])
Map([
<Rule '/ws/test_1' (GET, OPTIONS, HEAD) -> page_ws_test_1>,
<Rule '/hello' (GET, OPTIONS, HEAD) ->hello>,
<Rule '/static/<filename>' (GET, OPTIONS, HEAD) -> static>])
2.2.2 启动服务器
因为返回来的报文有websocket和HTTP两种,需要在WSGI中进行区分。
具体可以看下WebSocketHandler,此处略。
def run_app_websocket():
app_websocket = WSGIServer(('0.0.0.0', 9000), flask_app, handler_class=WebSocketHandler)
app_websocket.serve_forever() if __name__ == '__main__':
pass
#run_app()
run_app_websocket()
2.3 前端
<html>
<head>
<meta charset="utf-8" />
<title>websocket 测试</title>
<script src="https://cdn.bootcss.com/jquery/3.2.0/jquery.js">
</script>
<script type="text/javascript">
function WebSocketTest()
{
if ("WebSocket" in window)
{
// alert("您的浏览器支持 WebSocket!");
// 打开一个 web socket
var ws = new WebSocket("ws://localhost:9000/ws/test_2");
ws.onopen = function(){
// Web Socket 已连接上,使用 send() 方法发送数据
ws.send("请发送数据");
$("#r_s").append("数据发送中...<br>")
};
ws.onmessage = function (evt){
var received_msg = evt.data;
$("#r_s").append("server says: "+decodeURI(received_msg)+"<br>")
//ws.send("数据已收到。")
};
ws.onclose = function(){
// 关闭 websocket
ws.send("正在关闭连接...")
$("#r_s").append("连接已关闭...<br>")
};
}
else {
// 浏览器不支持 WebSocket
alert("您的浏览器不支持 WebSocket!");
}
}
</script>
</head>
<body>
<div id="sse">
<a href="javascript:WebSocketTest()">运行 WebSocket</a>
</div>
<div id="r_s">
操作记录:
<br />
</div>
</body>
</html>
3.测试结果
后端:
client says(2019-09-27-19-54-33): 请发送数据
页面:
操作记录:
数据发送中...
server says: 回执:server已收到消息!-- 2019-09-27-19-54-33
server says: 第0条消息。。。
server says: 第1条消息。。。
server says: 第2条消息。。。
server says: 第3条消息。。。
server says: 第4条消息。。。
server says: 第5条消息。。。
server says: 第6条消息。。。
server says: 第7条消息。。。
server says: 第8条消息。。。
server says: 第9条消息。。。
连接已关闭...
flask使用websocket的更多相关文章
- Flask 实现 WebSocket 通讯---群聊和私聊
一.WebSocket介绍 WebSocket是一种在单个TCP连接实现了服务端和客户端进行双向文本或二进制数据通信的一种通信的协议. WebSocket使得客户端和服务器之间的数据交换变得更加简单, ...
- Flask基于websocket的简单聊天室
1.安装gevent-websocket pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ gevent-websocket 2.cha ...
- Flask实现websocket
from flask import Flask,request user_socket_dict = {} app = Flask(__name__) @app.route("/conn_w ...
- flask POOL,websocket握手
一.POOL Pool就是为了多线程访问数据库,减少数据库压力 回顾pymysql import pymysql #建立连接 mysql_conn = pymysql.connect(host=&qu ...
- Flask 之 WebSocket
http:是一个协议 规定:数据传输格式 -/r/n/r/n 一次的请求,一次的响应,断开了 短链接 无状态 服务器收到的请求,做出的响应给客户端 客户端主动向服务器发起请求 基于socket sen ...
- 【Flask】 flask-socketio实现WebSocket
[flask-socektio] 之前不知道在哪个场合下提到过如何从web后台向前台推送消息.听闻了反向ajax技术这种模式之后,大呼神奇,试了一下之后发现也确实可以用.不过,反向ajax的代价也很明 ...
- 简单使用WebSocket实现聊天室
环境需求:flask,websocket第三方包 目录结构 web中实现群聊 ws_群聊.py文件 # 实现一个websocket 先下载包 gevent-websocket from flask i ...
- 轮询、长轮询和websocket
一.轮询 在一些需要进行实时查询的场景下应用比如投票系统: 大家一起在一个页面上投票 在不刷新页面的情况下,实时查看投票结果 1.后端代码 from flask import Flask, rende ...
- Python websocket
一.自己实现websocket 网上流传的都是Python2的websocket实现 # coding=utf8 # !/usr/bin/python import struct, socket im ...
随机推荐
- vue -- v-model 表单绑定
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 深度学习之numpy.poly1d()函数
1.np.poly1d()此函数有两个参数: 参数1:为一个数组,若没有参数2,则生成一个多项式,例如: p = np.poly1d([2,3,5,7]) print(p) ==>> ...
- 请求响应状态status为canceled
发出ajax请求之后 发现status状态是canceled 1. 和form冲突 我的提交代码是这样的 $.ajax({ //几个参数需要注意一下 type: "POST",// ...
- 【New】WoSo_我搜 正式上线
[New]WoSo_我搜 正式上线 一站式搜索平台 聚合多种领域搜索引擎,大大提高搜索效率,使搜索更简单 地址:https://huangenet.github.io/WoSo/
- HTML5学习(1)简介
HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定. HTML5的设计目的是为了在移动设备上支持多媒体. HTML5 简单易学. 什么是 HTML5? HTML5 ...
- robots.txt 让搜索引擎不再收录网站
有没有担心过自己的隐私会在强大的搜索引擎面前无所遁形?想象一下,如果要向世界上所有的人公开你的私人日记,你能接受吗?的确是很矛盾的问题,站长们大都忧虑“如何让搜索引擎收录的我的网站?”,而我们还是要研 ...
- 395. 至少有K个重复字符的最长子串
Q: A: 分治,对于字符串s的任何一个字符,如果它的频数(在s中出现的次数)小于k,则它一定不会出现在最后的结果里,也就是从它的位置一劈两半,考察左右.对于当前字符串s,我们先建立字典统计其中每种字 ...
- pyppeteer硬钢掉淘宝登入的滑块验证
完整代码我也不好公布,我可以给你们思路,以及部分代码动动脑子看看文档应该也能搞定 一.初始化Chromium浏览器相关属性 browser = await pyppeteer.launch({'hea ...
- vue 项目太大, 导致 javascript heap out of memory
原因: node 环境, 对单个进程的内存是有限制的, 但是现在前端项目太大, 所以我们需要根据当前机器环境, 手动加大node的内存限制 安装包 npm i increase-memory-limi ...
- VSCode配置FTP
首先在VScode中下载安装插件SFTP Windwos下摁Ctrl+Shift+P,输入SFTP: config命令并运行,进入sftp.json配置项如下: { "name": ...