Flask SocketIO:每个客户端设置
Posted
技术标签:
【中文标题】Flask SocketIO:每个客户端设置【英文标题】:Flask SocketIO: Per client settings 【发布时间】:2022-01-22 18:02:03 【问题描述】:当多个客户端连接到我的 socketio flask 应用程序时,如何实现每个客户端的设置?
我有什么:
@socketio.on('replay-start')
def replay(message):
while True:
if not paused:
emit('replay', dict(data=f'private replay'))
socketio.sleep(1)
现在如果客户端发送暂停事件,我只希望客户端循环暂停。
如果我这样实现:
@socketio.on('replay-pause')
def replay_pause(message):
global paused
paused = True
当然,这会暂停所有循环,而不仅仅是当前客户端之一。 有没有办法做到这一点?也许有一些“上下文对象”,我可以在其中看到发送消息的客户端的 ID?
【问题讨论】:
【参考方案1】:存储每个客户端设置的最方便的方法是使用 Flask 用户会话,它在 Socket.IO 处理程序上确实有效(但有一定的限制):
from flask import Flask, render_template, request, session
@socketio.on('replay-start')
def replay(message):
while True:
if not session.get('paused'):
emit('replay', dict(data=f'private replay'))
socketio.sleep(1)
@socketio.on('replay-pause')
def replay_pause(message):
session['paused'] = True
【讨论】:
【参考方案2】:我找到了答案,有request.sid
记录在案的here:
使用设置为连接的唯一会话 ID 的 sid 成员增强了请求上下文全局。此值用作添加客户端的初始房间。
这样就可以了:
from collections import defaultdict
from flask import Flask, render_template, request
paused = defaultdict(bool)
@socketio.on('replay-start')
def replay(message):
while True:
if not paused[request.sid]:
emit('replay', dict(data=f'private replay'))
socketio.sleep(1)
@socketio.on('replay-pause')
def replay_pause(message):
global paused
paused[request.sid] = True
【讨论】:
以上是关于Flask SocketIO:每个客户端设置的主要内容,如果未能解决你的问题,请参考以下文章
使用 Flask-socketio 和 socketIO 客户端
烧瓶-SocketIO + uWSGI。与 Mule 工人一起发射
Socket.io 与 flask-socketio python。如何设置套接字保持活动/超时