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