Как выполнить широковещательную рассылку из запроса не 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, если вы хотите увидеть полный код.