模板实时更新

Real time updates on template

我正在学习如何使用 tornado 来构建一个简单的网络应用程序。

但是我有点卡住了,因为我不知道如何用我在数据库中更新的值来更新模板变量

我目前拥有的:

龙卷风代码:

import json
import ast
from tornado.ioloop import IOLoop
import tornado.options
from tornado import web, gen
from tornado.httpserver import HTTPServer
from tornado.web import Application
from tornado.websocket import WebSocketHandler

import psycopg2
import psycopg2.extensions

conn = psycopg2.connect('dbname= dname user=user password=pass host=localhost port=5432')
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)


class MainHandler(web.RequestHandler):
    @gen.coroutine
    def get(self):
        self.render('index.html', result='test')


def poll(fd ,ev):
    state = conn.poll()
    if state == psycopg2.extensions.POLL_OK:
        if conn.notifies:
            notify = conn.notifies.pop(0)
            dict_notify = json.loads(notify.payload)
            print(dict_notify['new_value']['value'])

def listen(channel):
    cursor = conn.cursor()
    cursor.execute('LISTEN test_channel;')

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers = [(r'/', MainHandler)], debug = True)
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen('8888')
    io_loop = IOLoop.instance()
    io_loop.add_handler(conn.fileno(), poll, io_loop.READ)
    listen()
    io_loop.start()

我的模板是这样的:

<!DOCTYPE html>
<html lang="en">
    <head>
     <title>Index</title>
    </head>
    <body>
        <div>{{ result }}</div>
    </body>
</html>

现在,我想要的是我从 pool() 获得的值作为 {{result}} 在我的模板中。 pool() 函数总是打印我在数据库 (postgresql db) 中更新的值,但是我不知道如何在模板中获取它。有什么想法吗?

Tornado 的 RequestHandler 处理异步 HTTP 请求,即在发出下一个请求之前它无法更新响应。为此,您需要从数据库的方法中查询数据库,然后将结果传递给 self.render,后者将其插入到模板中,然后再发回。

为了从数据库推送实时更改,您需要使用 WebSocketHandler(您导入但在给定代码中无处使用),然后您还需要一些客户端代码(例如Javascript)接受推送的数据并将其插入呈现的页面。