我正在学习如何使用龙卷风来构建一个简单的网络应用程序。
但是我有点陷入困境,因为我无法弄清楚如何使用我在数据库中更新的值来更新模板变量
到目前为止我所拥有的:
龙卷风代码:
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)但是我无法弄清楚如何在模板中获取它。有什么想法吗?
答案 0 :(得分:0)
Tornado的RequestHandler
处理异步HTTP请求,即在下一个请求发出之前无法更新响应。为此,您需要从其方法中查询数据库,然后将结果传递给self.render
,然后将其插入模板中,然后再发送回来。
为了从数据库中推送实时更改,您需要使用WebSocketHandler
(您导入但在给定代码中无处使用),然后您还需要一些客户端代码(例如Javascript)接受推送的数据并将其插入渲染页面。