javascript - 手动重新加载网页 Tornado

标签 javascript python websocket tornado asyncsocket

是否可以在数据更新时重新加载页面?

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()

这是模板.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发生更改时,我需要更新客户端(网页)(从字典中删除smth,将smth添加到字典中)。我无法使用tornado.websocket 执行此操作。能否请你帮忙?我需要在从套接字读取行后更新 gui(您可以在我需要更新网页的代码中找到注释:# UPDATE GUI,网页此处)。因此套接字仍然可以打开(我们正在继续阅读行),但 GUI 必须更新。可以做到吗?

最佳答案

如果您确实想重新加载页面,那么您可以在 JavaScript 中发起对 window.location.reload() 的调用。 .

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

如果您只想更新 DOM (GUI),则监听客户端上的传入消息并进行相应更新。

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

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

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

关于javascript - 手动重新加载网页 Tornado,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33394327/

相关文章:

python - 根据唯一 ID Pandas 数据框收集行

java - 在java web应用程序中使用websocket

c# - 使用 WebSockets 的自托管 WCF 无法使用 SSL

javascript - 用于拦截/修改 websockets UA 的 Chrome 扩展 API

javascript - 使用 $routeParams undefined 和 ngRepeat :dupes error

javascript - 使用 Angular JS 添加图像

python - 在 Windows 10 anaconda 上安装 apache-airflow 时出错

python - GRPC:远程错误和消息中缺少参数

javascript - 在 node.js mysql 查询中,检查是否没有找到匹配项

javascript - 如何在 React.js 中的 localStorage 发生任何更改时立即更新状态