2016-12-10 1 views
0

간단한 웹 앱을 제작하기 위해 토네이도 사용법을 배우고 있습니다. 나는 내가 데이터베이스에 업데이트하고있어 가치가있는 템플릿 변수를 업데이트하는 방법을 알아낼 수 없기 때문에 조금 붙어 그러나템플릿의 실시간 업데이트

내가 지금까지 무엇을 가지고 :

토네이도 코드 :

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> 

, 내가 w 개미는 내 템플릿에서 {{result}} 으로 이동하기 위해 pool()에서 가져온 값입니다. pool() 함수는 항상 데이터베이스 (postgresql db)에서 업데이트 한 값을 인쇄하지만 템플릿에서 가져 오는 방법을 알 수는 없습니다. 어떤 아이디어?

+0

빠른 해결책은 전역 변수에 결과를 저장 한 다음 'render' 메소드에 전달하는 것입니다. – martinarroyo

답변

0

토네이도의 RequestHandler은 비동기 HTTP 요청을 처리합니다. 즉, 다음 요청이있을 때까지 응답을 업데이트 할 수 없습니다. 이를 위해서는 해당 메소드에서 데이터베이스를 쿼리 한 다음 결과를 self.render으로 전달해야합니다.이 결과는 다시 보내기 전에 템플릿에 삽입됩니다.

WebSocketHandler (데이터베이스에서 실시간 변경 내용을 가져 오려면 해당 코드에서 아무 것도 사용하지 않지만 가져 오기) 다음에 클라이언트 측 코드 (예 : 자바 스크립트)가 필요합니다. 푸시 된 데이터를 받아 들여 렌더링 된 페이지에 삽입하십시오.

+0

댓글을 주셔서 감사합니다. 다른 근원에서 당신의 통보 및 몇몇 자습서 다음 나는 그것을 일하기 위하여 처리했다 –