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