読者です 読者をやめる 読者になる 読者になる

Makoを使う

Pylons

 PylonsでMakoを使ってみます。現在のところのPylons標準のテンプレートエンジンMyghtyと、Makoの関係はよく分からないものがありますが(作者が同じ)、Makoの方が開発が活発のようなので、Pylonsの標準テンプレートエンジンもMakoに切り替わっていくのだと思われます。


 参考にするため、Pylons, SQLAlchemy(Elixir), Makoの組み合わせで作られている以下のサンプルアプリケーションもちらっと見てみました。

sookti - A `Thought for the day` application
http://code.google.com/p/sookti/


 しかし、このアプリケーション内での、Makoの使い方は、???な感じだった(Controllerの中でわざわざテンプレートエンジンモジュールを指定している)ので、別の資料を参考にしました。

Adding Genshi Template Engine
http://pylonshq.com/project/pylonshq/wiki/GenshiWithPylons


 この資料は、PylonsでGenshiを使うためのチュートリアルですが、テンプレートエンジン切り替えの手順は同じなので、Makoを使う方法に読み替えることができます。
 とはいっても、やることは、アプリケーションディレクトリのconfig/middleware.pyに次の二行を追加するだけです。

    # Load our Pylons configuration defaults
    config = load_environment()
    config.init_app(global_conf, app_conf, package='blogtutorial')

    # 次の2行を追加
    config.template_engines = []
    config.add_template_engine('mako', 'blogtutorial.templates', {})

 "blogtutorial"のところは、適宜自分のプロジェクト名に書き換えます。


 コントローラのコードは、次のような感じで、特別なことは何もしません。render_response関数に与えるテンプレートのファイル名の拡張子を初めからhtmlにしておいたり、別の関数でラップしてやると、Myghty, Makoの切り替えをあまり意識しなくて済むのではないでしょうか。

# -*- coding: utf-8 -*-
from blogtutorial.lib.base import *

class SearchController(BaseController):
    def index(self):
        return render_response('/search/index.html')


 あとは、必要なテンプレートをtemplatesディレクトリ以下に用意します。試しに、templates/search/base.htmlというレイアウト用テンプレートと、templates/search/index.htmlというテンプレートを用意しました。

<html>
<body>
<div class="header">
${self.header()}
</div>
${next.body()}
<div class="footer">
${self.footer()}
</div>
</body>
</html>
<%def name="footer()">
this is footer.
</%def>
<%inherit file="base.html"/>

<%def name="header()">
this is footer
</%def>

<%def name="body()">
<h2>It works!</h2>
<p>${"This is some text" | h }<p>
</%def>


 Makoではテンプレートの<%inherit />を使ってテンプレートの継承を行うことができます。inheritタグのfileに指定するパスは、fileの値がスラッシュで始まる場合は、<アプリケーションディレクトリ>/templatesを起点にしたパスとして扱われ、そうでない場合は、自分自身を起点にした相対パスとして扱われるようです。
 ${self.header()}, ${next.body()}のような、親テンプレートの関数ブロックを、子テンプレートの<%def>ブロックによって置き換えることができるというのは、すぐに分かったのですが、selfとnextの使い分けはまだよく分かっていません。


 MakoはSQLAlchemyの作者によるライブラリとあって、当初の印象よりはずっと好感をもつようになりましたが、あまり触れていません。時間を作って、一通りドキュメントを読んでみたいと思っています。

Mako Templates for Python
http://www.makotemplates.org/