2016-07-29 2 views
0

В настоящее время я пытаюсь использовать обработчики веб-сокетов Tornado для обновления панели инструментов каждый раз, когда вызывается определенная функция. вот обработчик:Tornado- как вызвать обработчик в другой функции

class WebSocketHandler(websocket.WebSocketHandler): 
    clients = [] 
    def open(self): 
     logging.info("WEBSOCKET OPEN") 
     WebSocketHandler.clients.append(self) 
    def on_message(self, message): 
     logging.info("message from websocket recieved") 
     self.write_message("WebSocket connected") 
    def on_close(self): 
     logging.info("WEBSOCKET closed") 

и вот клиент-скрипт, который соединяет WebSocket на нагрузке:

function WebSocketTest() 
{ var ws = 0; 
    ws = new WebSocket("ws://localhost:8008/WEB"); 
    ws.onopen = function() 
    { 
    ws.send("initial connect") 
    } 

    ws.onmessage = function (evt) 
    { 
    console.log(evt.data) 
    }; 

    ws.onclose = function() 
    { 
    console.log("closed "); 
    }; 
} 

В WebSockets подключить успешно.

Мне нужно позвонить write_message от WebSocketHandler, но я очень смущен, что это за экземпляр? ошибка, с которой я продолжаю сталкиваться, заключается в том, что self isn't defined, но я не уверен, что такое само? я знаю, что WebSocketHandler получает запускать каждый раз, когда клиент пытается загрузить ^/WEB$

EDIT: вот мой server.py файла, мне нужно позвонить write_message сразу после spawn callback вызова в itercheckers

class Server(): 



@classmethod 
def run(cls): 
    options.parse_command_line() 
    # Start web 
    template_path = os.path.join(os.path.dirname(__file__), 'templates') 
    jinja2loader = Jinja2Loader(template_path) 
    kwargs = dict(
     template_loader=jinja2loader, 
     static_path=os.path.join(os.path.dirname(__file__), 'static'), 
     debug=True, 
     login_url="/auth/login", 
     cookie_secret="dn470h8yedWF9j61BJH2aY701i6UUexx" 
    ) 
    app = web.Application(handlers, **kwargs).listen(
     configuration['server']['port'],) 

    # Reset events 
    @gen.coroutine 
    def reset(parent=None): 
     if parent is None: 
      parent = configuration 
     # Reset event happyness 
     yield events.reset_happy(parent) 
     # Read last status 
     data = yield events.get(parent) 
     # Read and set happy from the last status 
     happy = (data or {}).get('status', events.STATUS_OK) \ 
      in events.HAPPY 
     yield events.set_happy(parent, happy) 
     # Iterate sub-events 
     for event in parent['events']: 
      yield reset(event) 

    ioloop.IOLoop.current().run_sync(reset) 



    # Start checkers 
    def itercheckers(parent): 
     index = 0 
     for event in parent.get('events', []): 
      if 'checker' in event: 
       checker = event['checker'] 
       p, m = checker['class'].rsplit('.', 1) 
       ioloop.IOLoop.current().spawn_callback(
        getattr(importlib.import_module(p), m)(
         event=event, 
         frequency=checker.get('frequency', 1), 
         params=checker['params'] 
        ).run) 
      index += 1 
      itercheckers(event) 
    itercheckers(configuration) 



    # Start alerts 
    ioloop.IOLoop.current().run_sync(alerts.reset) 
    for alert in configuration['alerts']: 
     p, m = alert['class'].rsplit('.', 1) 
     ioloop.IOLoop.current().spawn_callback(
      getattr(importlib.import_module(p), m)(
       alert=alert 
      ).run 
     ) 

    # Start loop 
    ioloop.IOLoop.current().start() 
+0

Как у вас? вы не идете в ws: // localhost: 8000/ws? вы должны сделать html-страницу с js и открыть консоль на этой странице, чтобы посмотреть, что такое вывод –

+0

Нет, я делаю. ссылка для доступа к WebSocketHandler - «/ WEB». 'new WebSocket (« ws: // localhost: 8008/WEB »);' connects me –

ответ

0

Первого первое, self ключевого слова указывается на текущий клиент websocket, который обрабатывается в данный момент. Для того, чтобы использовать торнадо WebSockets вы должны инициализировать Tornado App

app = web.Application([ 
    (r'/ws', WSHandler), #tells it to redirect ws:// to websocket handler 
#Choose different names from defaults because of clarity 
]) 

if __name__ == '__main__': 
    app.listen(5000) #listen on what port 
    ioloop.IOLoop.instance().start() 

Тогда вы должны иметь класс WSHandler вы указывая WebSockets Trafic в

class WSHandler(websocket.WebSocketHandler): 
    #crossdomain connections allowed 
    def check_origin(self, origin): 
     return True 
    #when websocket connection is opened 
    def open(self): 
     print("Client connected ") 

    def on_close(self): 
     print("Client disconnected") 

    def on_message(self,message): 
     self.write_message(message) #echo back whatever client sent you 

Так полное приложение будет выглядеть

from tornado import websocket, web, ioloop 
clients = [] 

#whenever you want to broadcast to all connected call this function 
def broadcast_message(msg): 
    global clients 
    for client in clients: 
     client.write_message(msg) 

class WSHandler(websocket.WebSocketHandler): 
    #crossdomain connections allowed 
    def check_origin(self, origin): 
     return True 
    #when websocket connection is opened 
    def open(self): 
     #here you can add clients to your client list if you want 
     clients.append(self) 
     print("Client connected ") 

    def on_close(self): 
     clients.remove(self) 
     print("Client disconnected") 

    def on_message(self,message): 
     self.write_message(message) #echo back whatever client sent you 

app = web.Application([ 
    (r'/ws', WSHandler), #tells it to redirect ws:// to websocket handler 
#Choose different names from defaults because of clarity 
]) 

if __name__ == '__main__': 
    app.listen(5000) #listen on what port 
    ioloop.IOLoop.instance().start() 

И теперь подключить к нему с помощью js

function WebSocketTest() 
{ 
    var ws = new WebSocket("ws://localhost:5000/ws"); 
    ws.onopen = function() 
    { 
     ws.send("initial connect") 
    } 

    ws.onmessage = function (evt) 
    { 
     console.log(evt.data) 
    }; 

    ws.onclose = function() 
    { 
     console.log("closed "); 
    }; 
} 

Я не тестировал его, но должен был работать

+0

жаль, что я должен был включить его, но у меня есть файл 'server.py', где я создаю' web.Application' и передаю список обработчики. Я могу определенно подключить своих клиентов к серверу. Я пытаюсь выяснить, как отправить данные с сервера клиенту на основе серверного события. –

+0

Вы хотите отправить конкретному клиенту или всем клиентам –

+0

всем клиентам. это панель управления статусом, которую мне нужно обновлять всякий раз, когда вызывается определенная функция. –