Flask websocket
websocket
概念
是一套协议,协议规定了:
- 连接时需要握手
- 发送数据进行加密
- 连接之后不断开
意义
实现长轮询等操作
框架支持
- flask,gevent-websocket
- django,channel
- torando框架自带
应用场景
实时响应页面时,可以使用websocket。
缺点
兼容性比较差,版本较低的IE无法支持
使用方法
导入
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
启动
Flask 的启动的地方改成这样即可以支持 websocket ,同时并不会覆盖 http ,两者并存
if __name__ == '__main__':
http_server = WSGIServer(('0.0.0.0', 5000), app, handler_class=WebSocketHandler)
http_server.serve_forever()
后端操作
ws = request.environ.get('wsgi.websocket') # 要拿到websocket 的标识才可以操作
msg = ws.receive() # 从客户端接收消息
ws.send("你好啊") # 向客户端发送消息
前端操作
var ws = new WebSocket('ws://127.0.0.1:5000/message') // 不定义的话默认就是 HTTP,定义后往指定的url 发起 websocket 链接请求
ws.onmessage = function (event) { // 服务器端向客户端发送数据时,自动执行
var response = JSON.parse(event.data); // 接收服务端的数据
};
ws.send("你好呀") // 向服务端发送消息
示例
前端
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>丑男投票系统</h1>
<ul>
{% for k,v in users.items() %}
<li onclick="vote({{k}})" id="id_{{k}}">{{v.name}}<span>{{v.count}}</span></li>
{% endfor %}
</ul> <script src="{{ url_for('static',filename='jquery-3.3.1.min.js')}}"></script>
<script>
var ws = new WebSocket('ws://127.0.0.1:5000/message')
ws.onmessage = function (event) {
/* 服务器端向客户端发送数据时,自动执行 */
// {'cid':cid,'count':new}
var response = JSON.parse(event.data);
$('#id_'+response.cid).find('span').text(response.count); }; function vote(cid) {
ws.send(cid) // 发送信息
}
</script>
</body>
</html>
后端
from flask import Flask,render_template,request
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
import json app = Flask(__name__) USERS = {
'':{'name':'钢弹','count':0},
'':{'name':'铁锤','count':0},
'':{'name':'贝贝','count':100},
} # http://127.0.0.1:5000/index
@app.route('/index')
def index():
return render_template('index.html',users=USERS) # http://127.0.0.1:5000/message
WEBSOCKET_LIST = []
@app.route('/message')
def message():
ws = request.environ.get('wsgi.websocket')
if not ws:
print('http')
return '您使用的是Http协议'
WEBSOCKET_LIST.append(ws)
while True:
cid = ws.receive() # 接收信息
if not cid:
WEBSOCKET_LIST.remove(ws)
ws.close()
break
old = USERS[cid]['count']
new = old + 1
USERS[cid]['count'] = new
for client in WEBSOCKET_LIST:
client.send(json.dumps({'cid':cid,'count':new})) if __name__ == '__main__':
http_server = WSGIServer(('0.0.0.0', 5000), app, handler_class=WebSocketHandler)
http_server.serve_forever()
Flask websocket的更多相关文章
- Flask+WebSocket实现群聊与单聊功能
在开始我们的程序代码之前,先来了解一下相关的基础知识: 1.什么是websocket? (1)WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket ...
- flask + websocket实现简单的单聊和群聊
单聊 from flask import Flask,request,render_template from geventwebsocket.handler import WebSocketHand ...
- Python: Flask框架简单介绍
接触Python之后我第一次听说Flask,我就根据自己搜罗的知识尽可能简洁的说出来.如果不准确的地方还请指正,谢谢. Flask是什么? Flask是基于Python编写的微 ...
- 前端 - 轮询, 长轮训, websocket
轮询 概念 ajax 轮询的原理很简单,让浏览器间隔几秒就发送一次请求,询问服务器是否有新信息 代码 function showUnreadNews() { $(document).ready(fun ...
- 实时 Django 终于来了 —— Django Channels 入门指南
Reference: http://www.oschina.net/translate/in_deep_with_django_channels_the_future_of_real_time_app ...
- Django Channels 入门指南
http://www.oschina.NET/translate/in_deep_with_django_channels_the_future_of_real_time_apps_in_django ...
- Python 目录指引
1.0 Python 基础整合 1.1 变量 1.2 数据类型 1.3 基础语法 1.4 文件操作 1.5 函数 1.6 生成器 1.7 迭代器 1.8 装饰器 1.9 字符集 2.0 Python ...
- python 全栈之路
目录 Python 全栈之路 一. Python 1. Python基础知识部分 2. Python -函数 3. Python - 模块 4. Python - 面对对象 5. Python - 文 ...
- WebSocket with Flask
转自:https://blog.shonenada.com/post/websocket-with-flask/ WebSocket with Flask HTML5 以前,HTML 还不支持 Web ...
随机推荐
- 【Vue 2.x】计算属性
Vue对象,按照现在的学习进度,可以分为: 其中el代表作用的HTML元素: data代表el中的所有数据: methods代表el中所有元素上的事件: computed代表计算属性,用于计算data ...
- Odoo POS会员积分当钱用如何设置?
问题提问 设定积分规则1元积1分.而后每1积分可以当1分钱用,POS中能处理吗? 解决方案 1) 设定服务类型产品“积分”,其单价为0.01,收入科目为“销售费用” 2) 设定积分计划:积分规则是,订 ...
- 混用Int与IntPtr导致GetProcAddress始终返回null
注意NET某些类型在不同平台上的长度 NET中用句柄用得最多的是在DLLIMPORT中,混用int与intptr可能会导致某些API声明在X64平台中表现不正常,如 [DllImport(&quo ...
- C# 利用SharpZipLib生成压缩包
本文通过一个简单的小例子简述SharpZipLib压缩文件的常规用法,仅供学习分享使用,如有不足之处,还请指正. 什么是SharpZipLib ? SharpZipLib是一个C#的类库,主要用来解压 ...
- Android 开源框架Glide的使用
Glide是一个快速高效的多媒体管理和图像加载的框架,封装了Android平台的多媒体的解码,内存和硬盘缓存等,Glide支持解码.显示视频.图像和GIFs,Glide是基于定制的HttpUrlCon ...
- SVN下载与安装
首先打开浏览器上百度搜索“SVN”如下图: 或者点击:https://tortoisesvn.net/downloads.html 打开后链接后选择Downloads,选择需要下载的版本,比如我电脑是 ...
- python3 文件操作
步骤:打开文件->操作文件->关闭文件 打开文件 文件句柄 = open('文件路径', '模式') 指定文件编码 文件句柄= open('文件路径','模式',encoding='utf ...
- Saltstack_使用指南07_远程执行-执行模块
1. 主机规划 远程执行教程文档 https://docs.saltstack.com/en/latest/topics/tutorials/modules.html 所有模块文档 https://d ...
- 软件设计之Deep Module(深模块)
类是不是越小越好?最近在读John Ousterhout的<A Philosophy of Software Design>,感到作者文笔流畅,书中内容具有启发性.这里摘要一部分内容,以供 ...
- Mac下使用国内镜像安装Homebrew
First MBP上的brew很老了,就想把brew更新一下,顺便安装一下NodeJs.无奈更新的过程一直卡在网络下载,毫不动弹.想想,应该是Repo访问不到的原因,于是重装brew. 根据官网上的方 ...