Lento con forza

大学生気分のIT系エンジニアが色々書いてく何か。ブログ名決めました。

Tornado-UIModuleのcss_filesメソッド

TornadoのUIModuleでcss_filesの動きがどうなってるのか気になったので調べてみた。
具体的には、UIModuleを複数個呼び出した時に、css_filesでheadに書かれるcssファイルは複数個になるのか?って事です。
Tornadoに興味を持ってもらいたいし、UIModuleの説明から書きます。

UIModule

UIModuleは、Tornadoのテンプレートエンジン中でのモジュールの役割を果たしてくれるクラスです。
UIModule.css_filesは、UIModuleがモジュールとしてテンプレート内呼び出された時に予め指定しておいたcssのファイルをheadに読み込んでくれるというちょー便利メソッド。
似たような感じで、JavaScriptバージョンも存在してます。

こんな感じで使います。

main.py

class HelloModule(tornado.web.UIModule):
    def render(self):
        return '<h1>Hello, world!</h1>'
    def css_files(self):
        return 'css/sample.css'

template.html

<html>
    <head><title>Module Test</title></head>
    <body>
        {% module HelloModule() %}
    </body>
</html>

すごく便利ですね。

複数回呼び出したパターン

モジュールは何度も呼び出すことができるので、以下のような事もできます。
template2.html

<html>
    <head><title>Module Test</title></head>
    <body>
        {% module HelloModule() %}
        {% module HelloModule() %}
        {% module HelloModule() %}
    </body>
</html>

こういう使われ方をした時にTornadoで複数回css_filesが呼ばれて、複数のcssファイルを読んじゃわないのかな・・?って思ったため、tornadoのソースコード見に行って確かめてきました。

結論から言うと、CSSをファイルから読み込む処理にはsetを使って重複しないようにかかれてました。
まぁ、当たり前ですよね。

ソースを確認しないと気がすまない方は以下からどうぞ!
tornado/tornado/web.py at c20ab3547de8d99f19a8908458c3fc78e0b2d962 · facebook/tornado · GitHub