Flask SocketIO:每个客户端设置
Flask SocketIO: Per client settings
当多个客户端连接到我的 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?
我找到了答案,request.sid
已记录在案 here:
The request context global is enhanced with a sid member that is set to a unique session ID for the connection. This value is used as an initial room where the client is added.
所以这会起作用:
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 用户会话,它在 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
当多个客户端连接到我的 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?
我找到了答案,request.sid
已记录在案 here:
The request context global is enhanced with a sid member that is set to a unique session ID for the connection. This value is used as an initial room where the client is added.
所以这会起作用:
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 用户会话,它在 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