2015-10-28 5 views
0

Возможно ли перезагрузить страницу при обновлении данных?Ручная загрузка веб-страницы Tornado

import socket 

import tornado.ioloop 
import tornado.web 
import tornado.gen 
import tornado.ioloop 
import tornado.iostream 
import tornado.tcpserver 
import os 
import tornado.websocket 

last_messages = dict() 


class TcpClient(object): 

    client_id = 0 

    def __init__(self, stream): 
     super(TcpClient, self).__init__() 
     TcpClient.client_id += 1 
     self.id = 'Connection#%d' % TcpClient.client_id 
     self.stream = stream 

     self.stream.socket.setsockopt(
      socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) 
     self.stream.socket.setsockopt(
      socket.IPPROTO_TCP, socket.SO_KEEPALIVE, 1) 
     self.stream.set_close_callback(self.on_disconnect) 

    @tornado.gen.coroutine 
    def on_disconnect(self): 
     self.log("disconnected") 
     yield [] 

    @tornado.gen.coroutine 
    def dispatch_client(self): 
     try: 
      while True: 
       line = yield self.stream.read_until(b'\n') 

       text_line = line.decode('utf-8').strip() 
       last_messages[self.id] = text_line 
       # UPDATE GUI, webpage HERE 
       self.log('got |%s|' % text_line) 
     except tornado.iostream.StreamClosedError: 
      pass 

    @tornado.gen.coroutine 
    def on_connect(self): 
     raddr = 'closed' 
     try: 
      raddr = '%s:%d' % self.stream.socket.getpeername() 
     except Exception: 
      pass 
     self.log('new, %s' % raddr) 

     yield self.dispatch_client() 

    def log(self, msg, *args, **kwargs): 
     print('[%s] %s' % (self.id, msg.format(*args, **kwargs))) 


class TcpServer(tornado.tcpserver.TCPServer): 
    @tornado.gen.coroutine 
    def handle_stream(self, stream, address): 
     connection = TcpClient(stream) 
     yield connection.on_connect() 


class LastMessagesHandler(tornado.web.RequestHandler): 

    @tornado.web.asynchronous 
    def get(self): 
     self.render(
      'template.html', 
      sources=last_messages 
     ) 


class WebSocketHandler(tornado.websocket.WebSocketHandler): 

    def on_message(self, message): 
     print message 
     self.write(last_messages) 

def main(): 
    tcp = TcpServer() 
    tcp.listen(8008) 
    print('tcp://localhost:8008') 
    settings = dict(
     template_path=os.path.join(os.path.dirname(__file__), 'templates'), 
     static_path=os.path.join(os.path.dirname(__file__), 'static'), 
     debug=True, 
    ) 
    app = tornado.web.Application(
     [ 
      (r'/', LastMessagesHandler), 
      (r'/ws', WebSocketHandler) 
     ], 
     **settings 
    ) 
    app.listen(8009) 
    print('http://localhost:8009') 

    tornado.ioloop.IOLoop.instance().start() 


if __name__ == "__main__": 
    main() 

Вот template.html

<html> 
<head> 
<title>TCP server</title> 
</head> 
<body> 
    <title>Tornado WebSockets</title> 
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> 
    <script> 
     jQuery(function($){ 
      if (!("WebSocket" in window)) { 
      alert("Your browser does not support web sockets"); 
      }else{ 
      setup(); 
      } 


      function setup() { 
      var host = "ws://localhost:8008/ws"; 
      var socket = new WebSocket(host); 

      // event handlers for websocket 
      if(socket){ 

       socket.onopen = function(){ 
       //alert("connection opened...."); 
       } 

       socket.onmessage = function(msg){ 
       showServerResponse(msg.data); 
       } 

       /*socket.onclose = function(){ 
       //alert("connection closed...."); 
       showServerResponse("The connection has been closed."); 
       }*/ 

      }else{ 
       console.log("invalid socket"); 
      } 

      function showServerResponse(txt){ 
       var p = document.createElement('p'); 
       p.innerHTML = txt; 
       document.getElementById('output').appendChild(p); 
      } 


      } 
     }); 

    </script> 
    <div> 
     <ul id="output"> 
     {% for key, value in sources.iteritems() %} 
      <ul> {{key}} | {{value}} </ul> 
     {% end %} 
     </ul> 
    </div> 
</body> 
</html> 

мне нужно обновить клиента (веб-страницы), когда last_messages изменяется (чем-л удаляется Сформируйте Dict, чего-л было добавлено в Словаре). Я не могу это сделать, используя tornado.websocket. Не могли бы вы помочь? Мне нужно обновить gui после чтения строки из сокета (вы можете найти комментарий в коде, где мне нужно обновить веб-страницу: # UPDATE GUI, веб-страница ЗДЕСЬ). Таким образом, сокет можно открыть (мы продолжаем чтение строк), но gui необходимо обновить. Можно ли это сделать?

ответ

0

Если вы действительно хотите перезагрузить страницу, то в своем JavaScript вы можете позвонить по телефону window.location.reload().

Однако это закроет соединение WebSocket с клиентской стороны.

Если вы просто хотите обновить DOM (GUI), затем прослушайте входящее сообщение на клиенте и соответствующим образом обновите его.

Для того, чтобы наблюдать и отслеживать изменения данных, их можно использовать непосредственно в JavaScript или с помощью Object.observe, если вы работаете только с современным Chrome или с помощью polyfill или используете существующий инструмент, например, Backbone.js.

Если вы выберете последнее, я также могу рекомендовать tool to help you with working with WebSockets and Backbone.

Отказ от ответственности: Я являюсь автором Backbone.WS.

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