2016-12-10 10 views
0

私は単純なWebアプリケーションを構築するために竜巻を使用する方法を学んでいます。私は私がデータベースに更新していた値を持つテンプレート変数を更新する方法を見つけ出すことはできませんので、少しこだわっているしかしテンプレートのリアルタイム更新

私がこれまで持っているもの:

トルネードコード:

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> 

、どのようなIワット私のテンプレートで{{result}} になるようにpool()から取得した値です。 pool()関数は、データベース(postgresql db)で更新した値を常に出力しますが、テンプレートで取得する方法はわかりません。何か案は?

+0

すぐに解決できるのは、結果をグローバル変数に格納して、それを 'render'メソッドに渡すことです。 – martinarroyo

答えて

0

竜巻のRequestHandlerは、非同期HTTP要求を処理します。つまり、次の要求が行われるまで応答を更新できません。そのためには、そのメソッドからデータベースを照会し、その結果をself.renderに渡す必要があります。self.renderは、テンプレートを返す前にテンプレートに挿入します。

データベースからリアルタイムの変更をプッシュするには、WebSocketHandlerを使用する必要があります(このコードはインポートしますが、指定されたコードでは使用しません)。次に、クライアントサイドのコード(例:Javascript)プッシュされたデータを受け入れ、それをレンダリングされたページに挿入します。

+0

コメントありがとうございました。あなたの助言と他のソースからのチュートリアルに続いて、私はそれをうまく動かすことができました –

関連する問題