2015-06-01 2 views
0

Я использую Tornado для работы с html-файлом, и в то же время я хочу, чтобы моя программа Python динамически меняла значение на той же странице через websockets. Цель состоит в том, что значение можно увидеть с изменением, без необходимости обновления на стороне клиента.Tornado - Отправить сообщение клиенту по запросу

В этом случае я хочу отправить сообщение с переменной, которая изменяется от «1234» до «4321» каждые 4 секунды. У меня есть поток, делающий значение переключения, и я хочу, чтобы тот же поток отправлял это значение в websocket, поэтому я могу обработать его скриптом, используя функцию onmessage на стороне клиента.

Следующий код дает мне следующее сообщение об ошибке: Объект «Application» не имеет атрибута «write_message»

import tornado.ioloop 
import tornado.web 
import tornado.websocket 
import threading 
import time 

flag = True 

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.render("mypage.html") 

class wshandler(tornado.websocket.WebSocketHandler): 
    def open(self): 
     self.write_message('connected') 
      print "WebSocket opened" 
    def on_message(self, message): 
      self.write_message("You have sent: " + message) 
    def on_close(self): 
      print "WebSocket closed" 
    def write_message(self, message): 
     print ("writing message", message) 
     self.write_message(message) 

application = tornado.web.Application(
    handlers=[ 
     (r"/", MainHandler), 
     (r"/ws", wshandler), 
     ]) 

def toggle(): 
    global flag 
    while True: 
     if flag==True: 
      print 'now on 1234' 
      flag = False 
      application.write_message('1234') 
      time.sleep(4) 

     elif flag==False: 
      flag = True 
      application.write_message('4321') 
      print 'Now on 4321' 
      time.sleep(4) 

def main(): 
    global response 
    valueThread=threading.Thread(target=toggle, name="Toggle Value Thread") 
    valueThread.setDaemon(True) 
    valueThread.start() 
    application.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 




if __name__ == "__main__": 
    main() 

Моя проблема заключается в том, что каждый учебник/руководство Я видел о Торнадо только использует функцию write_message внутри функции open и onmessage в классе websocket .. поэтому я действительно не понимаю, почему это не сработает.

ответ

0

Вы должны использовать функцию write_message в пределах функции open и onmessage в классе websocket. Вы используете application, который является tornado.web.Application. У него наверняка не будет метода tornado.websocket.WebSocketHandler. Они не одни и те же. Отсюда и ошибка.

Я хотел бы сделать что-то вроде:

class wshandler(tornado.websocket.WebSocketHandler): 

    def toggle(self): 
     flag = True 
     while True: 
      if flag==True: 
       print 'now on 1234' 
       flag = False 
       self.write_message('1234') 
       time.sleep(4) 

      elif flag==False: 
       flag = True 
       self.write_message('4321') 
       print 'Now on 4321' 
       time.sleep(4) 

    def on_message(self, message): 
     if message == 'toggle': 
      self.toggle() 
+0

Спасибо. Но теперь, как я могу использовать эту функцию wshandler.toggle внутри потока для непрерывного цикла? Создание потока с target = wshandler.toggle вызовет ошибку. И почему мне все еще нужна функция onmessage? –

+0

Я просто предполагаю, что вы начнете переключать, когда получаете какое-то сообщение типа «переключить». Разве этот wshandler делает только одну работу или что? – skyline75489

+0

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

Смежные вопросы