手动重新加载web页面Tornado

手动重新加载web页面Tornado

问题描述:

数据更新时是否可以重新加载页面?手动重新加载web页面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改变为更新客户端(网页)(水木清华被删除的形式字典,水木清华已被添加到字典)。我不能使用tornado.websocket来做到这一点。能否请你帮忙?从套接字读取行后,我需要更新gui(可以在代码中找到需要更新网页的注释:#UPDATE GUI,此处的网页)。所以套接字仍然可以打开(我们正在继续读取行),但gui必须更新。可以做到吗?

如果你真的想重新加载页面,然后在你的JavaScript可以发起window.location.reload()通话。

但是,这将关闭客户端的WebSocket连接。

如果你只是希望更新的DOM(GUI),然后听客户端上的传入消息并相应更新。

要观察和跟踪数据更改,您可以使用JavaScript自行完成,或者如果您只在现代Chrome或polyfill上运行,或者使用现有工具(如Backbone.js),则可以使用Object.observe

如果您选择后者,我也可以推荐tool to help you with working with WebSockets and Backbone

免责声明:我Backbone.WS的作者。