如何为逻辑上分离的 Flask 路由分离套接字?

How to separate sockets for logically separated Flask routes?

我有一个相当复杂的 Flask 项目结构设置,它使用蓝图将不同的 "modules" 彼此分开,然后在每个模块中使用不同的路由。我现在想使用 flask-socketio 库向这个项目添加套接字功能。我的目标是将每个套接字分配给它自己的线程,由一个对象管理。我现在面临的问题是我不确定如何正确地将插座彼此分开。

(请注意,我现在正处于实验阶段,我还没有最终的概念,因此没有结论性的代码片段可以展示)

根据我的理解,每个套接字都有一个唯一的套接字 ID,当上下文在 socketio 事件中时,它存储在 flask.request.sid 中。这很好,因为我可以使用它来将事件与打开的套接字匹配,这意味着我知道哪个 "disconnect"-事件属于哪个 "connect"-事件,因为如果它们是同一套接字连接的一部分。

现在问题开始了。我试图找到一种方法,基于从套接字调用套接字的路由具有不同的事件处理程序。这意味着路由 .../admin/a 管理的事件与 .../admin/b 不同,因为这两条路由都指向我的 Web 应用程序的不同逻辑部分。在更大的范围内,我只有一个全局 socketio-object 在我的应用程序的所有蓝图上共享。如果我添加一个事件处理程序来响应蓝图 1 的套接字反馈,我绝对不希望蓝图 2 也能够用它自己的套接字触发它。

推荐的处理套接字分离的方法是什么?这甚至是在实践中使用的东西,还是我对如何在 Web 应用程序中使用套接字连接有根本错误的理解?

如果您有不同的套接字事件逻辑组并且希望彼此独立,则可以为每个套接字事件使用不同的命名空间。在 Socket.IO 中,一个或多个名称空间可以在同一物理传输上多路复用。

如果您喜欢更简单的名称,只需避免分配给事件的名称发生冲突即可。