Как выполнить широковещательную рассылку из запроса не SocketIO всем подключенным клиентам SocketiO?

Я использую сервер SocketIO с чем-то вроде:

from socketio.server import SocketIOServer
server = SocketIOServer(
   ('127.0.0.1', '8000'),
   resource='socket.io',
)
server.serve_forever()

У меня тогда есть пространство имен:

class Foo(BaseNamespace, BroadcastMixin):
    def on_msg(self, data):
        self.emit(data['msg'])

И наконец, у меня есть маршрут, такой как:

module = Blueprint('web', __name__)
@module.route('/')
def index():
    pkt = dict(
              type='event',
              name='new_visitor',
              endpoint='/foo'
           )

    ## HERE: How do I get the "socket" to look through each connection
    #for sessid, socket in blah.socket.server.sockets.iteritems():
    #    socket.send_packet(pkt)

    return render_template('index.html')

Итак, вышеупомянутая прокомментированная часть, где у меня есть проблема.

Что я сделал до сих пор:

  • Я углубился в код gevent-socketio и вижу, что сокеты там отслеживаются. Но я не уверен, что будет следующим шагом.
  • Заметил, что во Фляске request.environ имеет socketio значение, которое соответствует объекту. Однако это только по запросам SocketIO.

Любые подсказки или подсказки будут очень признательны.

1 ответ

Код, который я использую в своем расширении Flask-SocketIO, чтобы сделать то, что вы хотите:

def emit(self, event, *args, **kwargs):
    ns_name = kwargs.pop('namespace', '')
    for sessid, socket in self.server.sockets.items():
        if socket.active_ns.get(ns_name):
            socket[ns_name].emit(event, *args, **kwargs)

Моя фактическая реализация немного сложнее, я упростил ее, чтобы просто показать, как делать то, что вы просили. Расширение находится на github, если вы хотите увидеть полный код.

Другие вопросы по тегам