我正在尝试编写一个从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()
一旦服务器完成发送响应,就会关闭常规HTTP连接。因此,在连接关闭后,您无法向客户端发送任何数据。
要将实时数据更新发送到客户端,您可以使用Websockets。与常规HTTP连接不同,Websocket连接可以根据需要保持打开状态,服务器可以随时将数据发送到客户端。
Tornado的documentation非常适合开始使用Websockets。对于一些高级的东西,有一个聊天应用程序的demo - 随意玩这个。