2015-02-24 7 views
1

Я бегу сервер 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 code, и видеть, что гнезда хранятся отслеживаются там. Но я не уверен, каким будет следующий шаг.
  • Заметил, что в Flask request.environ имеет значение socketio, соответствующее объекту. Однако это касается только запросов SocketIO.

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

ответ

0

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

+0

Моя проблема заключается в получении объекта 'server' в запросе, отличном от SocketIO. Я сделал немного уродливого взлома, чтобы сделать это сейчас, используя «глобальный», но должен быть лучший способ. Скоро опубликует исполняемый код, чтобы лучше объяснить мою проблему. Цените свой вклад и время, конечно! –

+0

добавьте ваш сокет-сервер в ваш экземпляр приложения Flask (например, 'app.socketio = server'), а затем укажите его как' current_app.socketio'. – Miguel