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。如何设置套接字保持活动/超时

[翻译] flask-SocketIO

如何在 Flask-SocketIO 中向测试客户端推送通知?

向特定用户发出的 SocketIO(不为每个客户端使用单独的房间)