Я использую 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 .. поэтому я действительно не понимаю, почему это не сработает.
Спасибо. Но теперь, как я могу использовать эту функцию wshandler.toggle внутри потока для непрерывного цикла? Создание потока с target = wshandler.toggle вызовет ошибку. И почему мне все еще нужна функция onmessage? –
Я просто предполагаю, что вы начнете переключать, когда получаете какое-то сообщение типа «переключить». Разве этот wshandler делает только одну работу или что? – skyline75489
Toggle начнется как поток, и этот поток начнется в основной функции. Я не хочу, чтобы начать, когда сервер получает сообщение. Я хочу переключить отправку нежелательного сообщения. Это просто отправка сервера и не дожидаясь запроса. –