Tornadoを使ってみる

UI Module機能


Tornado独特の機能にUI Moduleが有ります。
UIの最も簡単なサンプルを紹介します。

以下のHelloModuleクラスがUI Moduleで、appオブジェクトを作る際にui_modulesでモジュール名(Hello)とクラス(HelloModule)を登録します。
#
# Basic Module Usage
#
import tornado.web
import tornado.httpserver
import tornado.ioloop
import tornado.options
import os.path

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class HelloHandler(tornado.web.RequestHandler):
    def get(self):
        print("HelloHandler:get")
        self.render('hello.html')

class HelloModule(tornado.web.UIModule):
    def render(self):
        print("HelloModule:render")
        return '<h1>This is HelloModule</h1>'

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(
        handlers=[(r"/", HelloHandler)],
        template_path=os.path.join(os.path.dirname(__file__), "templates"),
        debug=True,
        ui_modules={'Hello': HelloModule}
    )
    server = tornado.httpserver.HTTPServer(app)
    server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

テンプレート(hello.html)は以下の様になります。
テンプレートの中でHelloモジュールを呼び出しています。
<html>
    <head><title>UI Module Example</title></head>
    <body>
        {% module Hello() %}
    </body>
</html>

実行すると以下の様に表示されます。


pythonを起動したターミナルには以下の様に表示されます。
これを見てわかるように、HelloHandlerのget()が実行されhello.htmlを表示します。
hello.htmlを表示する際に、HelloModuleのrender()が呼び出されます。


UI Moduleを使うと、この様にテンプレート中からpython側のコードを実行できます。
テンプレート内にPythonコードを記述する事ができますが、これをさらに拡張した使い方ができます。

MVC Frameworkでは以下を分離することになっています。
model: アプリケーションデータ、ビジネスルール、ロジック、関数
view: グラフや図などの任意の情報表現
controller: 入力を受け取りmodelとviewへの命令に変換する

UI Module機能を使うとViewの部分にModelが入り込んでしまうので多用すると訳がわかならなくなります。

続く
...