根据异步mongoDB查询不断更新表

时间:2017-12-26 23:41:33

标签: python node.js mongodb asynchronous tornado

我正在尝试编写一个从mongoDB中提取的网页,并根据返回的值更新表。目前我可以使用motor查询mongoDB并异步处理每条消息。但是我只能在每次加载页面时写一次。我想知道是否有办法设置龙卷风从mongoDB连续拉出,只要页面打开?这是我目前每页加载工作但我不确定如何根据mongoDB更新时动态更新。

import tornado.ioloop, tornado.web, motor

class LoadHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        db = self.settings['db']
        self.write('''
        <<!doctype html>
        <html lang="en">
            <head>
                <title>Coin Info</title>
                <meta http-equiv="content-type" content="text/html; charset=utf-8">
                <script type=text/javascript src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
                <style>
                  div.table {border: 1px solid black; display: table; width: 500px;}
                  div.row {border: 1px solid black; display: table-row; }
                  div.cell {border: 1px solid black; display: table-cell; }
                  div.wrapper { float: left;width: 200px; }
                </style>
            </head>
            <body>
                <div class="wrapper">
                    <div class="table">
                        <div class="header">
                            <div class="cell">Name</div>
                            <div class="cell">Item1</div>
                            <div class="cell">Item2</div>
                            <div class="cell">Item3</div>
                        </div>
        ''')
               db.posts.find().sort([('_id',-1)]).each(self._got_message)

    def _got_message(self, message,error):
        if error:
            raise tornado.web.HTTPError(500, error)
        elif message:
            self.write('<div class="row">')
            self.write('<div class="cell" data-name={0}>{0}</div>'.format(message['values']['name']))
            self.write('<div class="cell" data-item1={0}>{0}</div>'.format(message['item1']))
            self.write('<div class="cell" data-item2={0}>{0}</div>'.format(message['values']['item2']))
            self.write('<div class="cell" data-item3={0}>{0}</div>'.format(message['values']['item3']))
             self.write('</div>')
        else:
            self.write('</div></div></div></div></body>')
            self.finish()

class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        self.write('here')
        self.finish()

db = motor.MotorClient().current_db

application = tornado.web.Application([
        (r'/load/', LoadHandler),
        (r'/', MainHandler)
    ], db=db
)

print('Listening on http://localhost:5000')
application.listen(5000)
tornado.ioloop.IOLoop.instance().start()

1 个答案:

答案 0 :(得分:1)

服务器完成发送响应后,将立即关闭常规HTTP连接。因此,在连接关闭后,您无法向客户端发送任何数据。

要将实时数据更新发送到客户端,您可以使用Websockets。与常规HTTP连接不同,Websocket连接可以根据需要保持打开状态,服务器可以随时将数据发送到客户端。

Tornado的documentation非常适合开始使用Websockets。对于一些高级的东西,有一个demo的聊天应用程序 - 随意玩这个。