Flask-----flask-socketIO
环境要求
# python版本必须要3.6+,下面是对flask-socketio包运行方式的概述:
1. eventlet是性能最好的选择,支持长轮询和WebSocket传输。
2. 也可以使用gevent。gevent包完全支持长轮询传输,但与eventlet不同的是,gevent没有原生 WebSocket 支持。要添加对 WebSocket 的支持,目前有两个选项。安装gevent-websocket 包为 gevent 添加了 WebSocket 支持,或者可以使用带有 WebSocket 功能的uWSGI Web 服务器。使用 gevent 也是一个性能比较高的选择,但比 eventlet 略低。
3. 也可以使用基于 Werkzeug 的 Flask 开发服务器,但需要注意的是,该 Web 服务器仅用于开发用途,因此它应该仅用于简化开发工作流程,而不用于生产。
# Flask-SocketIO会根据安装的包自动检测要使用的异步框架。优先使用 eventlet,其次是 gevent。对于 gevent 中的 WebSocket 支持,首选 uWSGI,其次是 gevent-websocket。如果 eventlet 和 gevent 均未安装,则使用 Flask 开发服务器。
# 如果使用多个进程,则必须配置消息队列服务以允许服务器协调广播等操作。支持的队列是Redis、RabbitMQ、 Kafka以及Kombu包支持的任何其他消息队列。
# 在客户端,可以使用官方的 Socket.IO Javascript 客户端库来建立与服务器的连接。还有用 Swift、Java 和 C++ 编写的官方客户端。非官方客户端也可以工作,只要它们实现了 Socket.IO 协议就可以。Python-SocketIO 包是实现了SocketIO协议的Python客户端。(注:Python-SocketIO也是Flask-SocketIO作者写的)。
模块安装
pip install flask-socketio
快速开始
后端代码
from flask import Flask, render_template, request
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@app.route('/')
def index():
return render_template('index.html')
# 建立连接时触发的事件
@socketio.on("connect")
def connect(message):
print(request.remote_addr)
print(request.sid)
emit('my response', {'data': 'got it!'})
# 自定义事件:my_event
@socketio.on("my_event")
def my_event(message):
print(request.remote_addr)
print(request.sid)
emit('my response', {'data': 'got it!'})
if __name__ == '__main__':
socketio.run(app)
当然,也支持init_app()
这种方式的初始化风格。请注意 Web 服务器的启动方式,现在变为socketio.run()
,而不是app.run()
。
当应用程序处于调试模式时,socketio.run()
仍然使用的是Werkzeug 开发服务器。在生产模式下,如果可用,则使用 eventlet
网络服务器,否则使用 gevent
网络服务器。如果未安装 eventlet
和 gevent
,则使用 Werkzeug
开发 Web 服务器。
前端代码
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
var socket = io();
socket.on('connect', function() {
// 向my_event事件发送消息
socket.emit('my_event', {data: 'I\'m connected!'});
});
</script>
自定义事件
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
<script src="https://cdn.socket.io/4.6.0/socket.io.min.js"
integrity="sha384-c79GN5VsunZvi+Q/WObgk2in0CbZsHnjEqvFxC5DxHn9lTfNce2WW6h2pH6u/kF+"
crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
var socket = io();
socket.emit('my_create_event', {"message": '我已经建好连接了'},function (res) {
console.log(res)
});
</script>
</html>
后端代码
from flask import Flask, render_template, request
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@app.route('/')
def index():
return render_template('index.html')
# 自定义my_create_event事件,必须和前端定义的事件一致
@socketio.on("my_create_event")
def my_create_event(message):
print(request.remote_addr)
print(request.sid)
print("前端传递的数据:",message)
return {"result":"服务端返回的数据"}
if __name__ == '__main__':
socketio.run(app)
python防脱发技巧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!