SocketIO 发送给特定用户(无需为每个客户端使用单独的空间)

2024-01-11

我正在尝试开发一个支持后端长任务的网络应用程序。我在用flask-socketio与芹菜一起打包在我的服务器上。我的工作流程如下:

  1. 当客户端打开 Html 页面时,我启动到服务器的套接字连接,该连接为用户创建一个 uid 并将其发回。
  2. 现在,一旦用户发布了对长任务的请求——我使用 celery 来安排它,一旦完成,我需要将其发送给发布请求的用户。 (我在post请求中存储了相关的userid)

我看过@Miguels 的回答39423646/flask-socketio-emit-to-特定用户 https://stackoverflow.com/questions/39423646/flask-socketio-emit-to-specific-user它为每个用户创建一个单独的房间,然后在该房间上广播消息。但我想问是否有其他更简单的方法来做到这一点,因为它似乎效率低下或强制的方式来做到这一点。

我还遇到了nodejs解决方案(如何使用套接字 io 向特定客户端发送消息 https://stackoverflow.com/questions/17476294/how-to-send-a-message-to-a-particular-client-with-socket-io)我觉得这是实现这一目标的更自然的方式。 python-socketio 中也有类似的解决方案吗?


Update: 经过一番搜索,我发现了以下解决方案 https://gist.github.com/ericremoreynolds/dbea9361a97179379f3b#gistcomment-1730314在 github 要点上。据此 -- ** flash-socketIO 已经将所有客户端放在由request.sid **.

我仍然希望讨论其他方法来做到这一点。具体来说,如果网站流量相当高,是否会导致房间过多?


更新(2): 我当前的(工作)服务器代码使用房间。这是借用并修改的Flask-SocketIO celery 示例 https://github.com/jwhelland/flask-socketio-celery-example

@celery.task(bind=True)
def long_task(self, userid, url):
    # LONG TASK
    time.sleep(10)
    # meta = some result
    post(url, json=meta) 
    # It seems i can't directly emit from celery function so I mimic a post request and emit from that function 
    return meta

@app.route('/longtask', methods=['POST'])
def longtask():
    userid = request.json['userid']
    task = long_task.delay(elementid, userid, url_for('event', _external=True))
    return jsonify({}), 202

@socketio.on('connect', namespace='/custom')
def events_connect():
    userid = str(uuid.uuid4())
    session['userid'] = userid
    current_app.clients[userid] = request.sid
    emit('userid', {'userid': userid})

@app.route('/event/', methods=['POST'])
def event():
    userid = request.json['userid']
    data = request.json
    roomid = app.clients.get(userid)
    socketio.emit('celerystatus', data, namespace='/custom', room=roomid)
    return 'ok'
    



您不必创建任何房间来处理单个用户。只需设置to论证sid您想要联系的用户:

emit('my event', my_data, to=user_sid)

The sid分配给每个用户的值在connect事件处理程序为request.sid.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SocketIO 发送给特定用户(无需为每个客户端使用单独的空间) 的相关文章

  • 如何将字典转换为字符串

    我正在尝试使用提供的解决方案here https stackoverflow com questions 5192753 how to get the number of occurrences of each character usin
  • 有没有办法拥有租户特定的 JWT 令牌

    我目前正在开发一个 SPA 应用程序 角度 后端使用 Python Flask API 该应用程序将支持多个租户 我对安全概念有点挣扎 我目前正在使用 jwt extend 颁发的 JWT 令牌对所有租户都有效 我当然可以从令牌中获取用户
  • 我应该将Python的pyc文件添加到.dockerignore吗?

    我见过几个例子 dockerignorePython 项目的文件 其中 pyc文件和 或 pycache 文件夹被忽略 pycache pyc 由于无论如何这些文件 文件夹都会在容器中重新创建 我想知道这样做是否是一个好习惯 是的 这是一个
  • 会话cookie太大烧瓶应用程序[重复]

    这个问题在这里已经有答案了 我正在尝试使用会话 本地 加载某些数据 并且它已经工作了一段时间 但是现在我收到以下警告 并且不再加载通过会话加载的数据 b session cookie 太大 该值是 13083 字节 但是 标头需要 44 个
  • python下安装xgboost 32位msys失败

    尝试安装 xgboost 失败 Windows 和企业版版本为 Anaconda 2 1 0 64 位 我该如何继续 我一直在使用 R 似乎从 RStudio 在 R 中安装新包相当容易 但在间谍程序中则不然 因为我需要进入命令窗口来执行此
  • Python 请求包含有值的参数和没有值的参数

    我正在为 API 编写一个 Python 包装器 该 API 支持具有值的查询参数 例如param1如下 和查询参数do not有价值观 例如param2如下 即 https example com service param1 value
  • Pythonwinsound,ASYNC 标志不起作用?

    我正在使用 python 3 5 我试图在继续执行脚本的同时播放声音 根据https docs python org 3 5 library winsound html https docs python org 3 5 library w
  • 将多个 csv 文件连接成具有相同标头的单个 csv

    我目前正在使用以下代码导入 6 000 个 csv 文件 带标题 并将它们导出到单个 csv 文件 带单个标题行 import csv files from folder path r data US market merged data
  • Python 结构的 PHP 替代品

    我很高兴在我的 Python 项目中使用 Fabric 进行部署 现在我正在从事一个更大的 PHP 项目 想知道是否有类似 PHP 的 Fabric 之类的东西 唔 为什么这有关系 Fabric 只是 python 脚本 所以它与项目语言无
  • django 密码重置功能中出现 NoReverseMatch 错误

    我正在尝试在 django 中实现密码重置功能 下面是我的代码 urls py urlpatterns patterns url r signup accounts views signup name signup email url r
  • 反应本机套接字 io 没有从客户端发出事件

    尝试将socket io client与react native 现在是ios 一起使用 到目前为止 连接 从客户端接收服务器端事件似乎工作正常 但是我似乎无法从客户端发出任何事件 Client var socket io http loc
  • 从 SQL 数据库导入表并按日期过滤行时,将 Pandas 列解析为日期时间

    我有一个DataFrame列名为date 我们如何将 日期 列转换 解析为DateTime object 我使用 Postgresql 数据库加载日期列sql read frame 的一个例子date列是2013 04 04 我想做的是选择
  • python 3 configparser.read() 在给定不存在的文件时不会引发异常

    当我尝试使用 configparser read 读取不存在的文件时 我认为它应该引发异常 事实并非如此 它返回一个空列表 显然 我可以测试空列表并引发异常 在我看来 如果 configparser read 引发 FileNotFound
  • Python 正则表达式中的 \B+ 与 [\B]+ 与 [^\b]+

    我在回答 SO 问题时遇到了一个我不明白的问题 我创建了一个简化的示例来说明该问题 场景 我正在测试两个标记 不是随机的英语单词 在字符串中至少相距一定距离 在这个例子中 我们有一个动物列表 我们要确保在羊和狼之间至少还有其他三种动物 否则
  • 当输入是 DataFrame 时,在seaborn中对箱线图进行分组

    我打算在一个图中绘制多个列pandas dataframe 全部按另一列分组 使用groupby inside seaborn boxplot 对于类似的问题 这里有一个很好的答案matplotlib matplotlib 分组箱线图 ht
  • Django model.foreignKey 并返回 self.text 错误

    所以我正在 Django 中处理 model py 但遇到了 2 个 pylint 错误 我不明白为什么 这是 pylint 的问题还是我在代码中做错了什么 E1120 No value for argument on delete in
  • 在 envoy 中使用 rm *(通配符):没有这样的文件或目录

    我正在使用 Python 和 Envoy 我需要删除目录中的所有文件 除了一些文件外 该目录是空的 在终端中 这将是 rm tmp my silly directory 常识表明 在特使中 这转化为 r envoy run rm tmp m
  • 忽略稀疏矩阵中的重复条目

    我尝试过初始化csc matrix and csr matrix从列表中 data rows cols 值如文档所示 sparse csc matrix data rows cols shape n n 问题是 我实际上拥有的生成方法dat
  • Pandas 数据透视表同时包含多列

    我怀疑是否pandas pivot table可以一次接受两列并单独处理它们 而不是分层处理 假设我有以下数据框 id date day val 101 11 1 1 1 2 1 101 11 1 2 2 2 2 101 11 1 3 3
  • 如何在express中动态渲染/加载页面?

    我需要使用express gt 3 0 框架动态加载 渲染nodejs v1 8 15 中页面的一部分 一般来说 我想创建一个单页应用程序 我在页面顶部有一个带有链接的菜单 单击链接将更改下面的内容 就像 AJAX 页面加载一样 例如 gt

随机推荐

  • 如何向 Django Celery Flower Monitoring 添加身份验证和端点?

    我一直在本地使用flower 它似乎很容易设置和运行 但我不知道如何在生产环境中设置它 特别是 如何添加身份验证以及如何定义 url 来访问它 对于自定义地址 请使用 address旗帜 对于身份验证 请使用 basic auth flag
  • 如何以编程方式将 Word 文件转换为 PDF? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我发现了几个开源 免费软件程序 允许您将 doc 文件转换为 pdf 文件 但它们都是应用程序 打印机驱
  • 更改颜色文本谷歌甘特图(javascript),无需CSS

    如何在不使用或插入 css 的情况下更改左侧文本颜色 此代码与文档相同 我知道颜色取决于资源 我不会更改活动栏的颜色 而只会更改与其关联的文本 google charts load current packages gantt google
  • 如何在 Python 中绘制第一个楔形在顶部的饼图? [matplotlib]

    如何使用 Matplotlib 绘制第一个楔形从中午开始 即在饼图顶部 的饼图 默认值是用于pyplot pie 将第一个边缘放置在三点钟位置 如果能够自定义它就太好了 仅仅因为这出现在我的 Google 搜索中 我会补充说 与此同时 ma
  • ASP.Net 5 登录类库

    我对依赖注入有点陌生 我正在尝试开始使用 ASP NET 5 并且正在努力弄清楚如何使用 ASP NET 5 类库中的服务 尤其是像日志记录和 EF 数据访问这样简单的事情 例如 我已按照此处的指南进行操作 http docs asp ne
  • 避免向列表中添加重复元素 C#

    string lines3 new string 100 List
  • 为什么我在 Ubuntu 中使用 wget 无法获取此页面? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 http 121 199 111 177 http 121 199 111 177 我用win7 IE8 访问这个网址 没问题 可以获取页面 但如果我
  • Spring 3.1 JSON 日期格式

    我正在使用带注释的 Spring 3 1 MVC 代码 spring mvc 当我通过 RequestBody 发送日期对象时 日期显示为数字 这是我的控制器 Controller RequestMapping test public cl
  • Visual Studio Code 文件。排除设置不起作用

    我正在使用 Unity 并尝试从文件资源管理器侧边栏中排除 meta 文件 我导航到文件 gt 首选项 gt 用户设置 或工作区设置 无关紧要 并将文件的内容设置为以下内容 Place your settings in this file
  • TestCafe - 将选择器的结果存储在变量中

    因此 为了测试 我的搜索结果根据我输入的关键字而有所不同 我想在输入关键字之前存储 searchResults 的节点列表 然后将它们与添加关键字后获得的 searchResults 的节点列表进行比较 但是我无法让它工作 我试过了 let
  • Google Chrome 开发者工具包速度很慢

    我已经使用 Google Chrome 的开发工具包 元素检查 堆栈跟踪 JavaScript 调试等 一段时间了 并取得了巨大的成功 然而 大约两周前 它突然变得非常迟缓 例如 当我右键单击 UI 中的某个元素 然后单击 检查元素 时 或
  • Onedrive cors 在 JavaScript 中下载

    我正在尝试在客户端 JavaScript 中处理 onedrive 文件 但首先我需要一种使用 XMLHttpRequest 下载文件的方法 Onedrive支持cors进行很多操作 但是将文件下载到javascript中存在以下问题 正如
  • 在mysql中创建表约束

    我有一个表 其中有一些列a b c每列都有另一列 例如 x y z 这取决于a b c分别 x y z将会有价值1 if a b c具有任何值并且将包含 null 如果a b c has null 举个例子吧 存储的值a is 2 and
  • 静态档案中的 C 符号可见性

    我有文件 foo c bar c 和 baz c 以及定义函数 myfn 的包装器代码 myfn c 该函数使用其他文件中的代码和数据 我想创建诸如目标文件或存档 myfn o 或 libmyfn a 之类的内容 以便 myfn 可以供其他
  • string.Format() 参数

    可以向 string Format 方法传递多少个参数 必须有某种理论上的或强制的限制 它是否基于 params 类型的限制或使用它的应用程序的内存使用情况或完全基于其他原因 好的 我从隐藏中出现 我使用以下程序来验证发生了什么 而 Mar
  • 不带对话框窗口保存

    我正在尝试编写一个脚本来自动执行 Photoshop CS5 的许多操作 其中一部分涉及保存一堆文件 有没有一种方法可以在不打开对话框窗口的情况下保存文件 我一直在寻找JavaScript 工具指南 http wwwimages adobe
  • 如何在 BigQuery 中取消嵌套两列中的两个列表而不使用叉积作为单独的行

    我在 BigQuery 中有一个表 它有两列 每列包含一个数组 对于给定的行 两列将包含相同长度的数组 但该长度可能因行而异 WITH tbl AS select a b c AS one 1 2 3 as two union all se
  • 如何异步渲染局部视图

    可以异步渲染部分视图吗 我有一个需要渲染博客文章的部分视图 博客文章异步返回 In my Layout文件我渲染我的部分页脚 Footer In Footer我有以下标记 Html Action FooterLatestBlogPosts
  • 在 Dex 阶段构建大型 Codename One 应用程序时出错

    在 dex 阶段发送 Android 构建时 我在构建服务器中遇到错误 谷歌搜索了一下我了解到64K函数有一个硬限制 包括所有库 最重的是google play服务 或者你可以使用多个dex机制 如何为代号一激活此功能 我明白代号一 htt
  • SocketIO 发送给特定用户(无需为每个客户端使用单独的空间)

    我正在尝试开发一个支持后端长任务的网络应用程序 我在用flask socketio与芹菜一起打包在我的服务器上 我的工作流程如下 当客户端打开 Html 页面时 我启动到服务器的套接字连接 该连接为用户创建一个 uid 并将其发回 现在 一