Pyramid は、 2 つのテンプレートエンジン Mako および Chameleon の アダプターを含んでいます。 Mako は Pylons のデフォルトエンジンなので 馴染みがあるでしょう。他のエンジンに対するサードパーティのアダプターが 利用可能です: “pyramid_jinja2” (Jinja2 アダプター)、 “pyramid_chameleon_gensi” (部分的な Genshi エミュレーター) など。
Pylons で Mako を使用するために、設定の中でテンプレート検索パスを 指定しなければなりません:
[app:main]
...
mako.directories = pyramidapp:templates
これによって renderer="/mytemplate.mak" のような相対的なテンプレート パスや renderer="/mytemplate.mak" のような疑似 URL パスが使えるように なります。さらに、これによってテンプレートが他のテンプレートから継承したり、 他のテンプレートをインポートしたり、他のテンプレートをインクルードしたり することが可能になります。この設定なしでは、レンダラー引数は asset スペック構文でなければならず、テンプレートは他のテンプレートを起動する ことができないでしょう。
“mako.” 接頭辞を持つすべての設定は Mako の TemplateLookup コンストラクタに渡されます。例えば、
mako.strict_undefined = true
mako.imports =
from mypackage import myfilter
mako.filters = myfilter
mako.module_directory = %(here)s/data/templates
mako.preprocessor = mypackage.mako_preprocessor
”.mak” または ”.mako” で終わるテンプレートファイル名は Mako レンダラー に送られます。 ”.html” のような他の拡張子が使いたければ、 main 関数に これを入れてください:
config.add_renderer(".html", "pyramid.mako_templating.renderer_factory")
Mako レンダラーが正確にどのように実装されているかに関してさらなる質問が あれば、ソースを見るのが一番です: pyramid.mako_templating 。 どの引数の値が何を引き起こすかを確認するために、ソースコードと Mako ドキュメンテーションを照合することができます。
注意: Beacon sessons (訳注: Beaker session のこと?) を設定していない アプリケーションで “mako.strict_undefined” を true にセットしたら、 それは debug ツールバーを壊しました。ツールバーテンプレートには “% if” によって保護されていない sloppy (不注意、だらしない) な プレースホルダーがいくつかあるのかもしれません。
注意2: テンプレートパスの代わりに asset スペックを渡すことができる はずですが、私はそれを動作させることができませんでした。
Chameleon は Zope に由来する XML ベースのテンプレート言語です。 それには Genshi とのいくつかの類似点があります。そのファイル名拡張子 は .pt (「ページテンプレート」) です。
Chameleon の利点:
Chameleon の欠点:
レンダラーがテンプレートを起動する場合は常に、テンプレートネームスペース にはビューが返した辞書に加えて以下のシステム変数のすべての変数が含まれて います:
現在のリクエスト。
ビューインスタンス (クラスベースのビューの場合) または関数 (関数ベースのビューの場合)。インスタンス属性を直接読むことができます: view.foo 。
コンテキスト (request.context と同じ)。 (Mako にはこの名前を 持った内蔵の変数があるので Mako において可視ではありません; 代わりに request.context を使用します。)
完全修飾されたレンダラー名。たとえば ”zzz:templates/foo.mako” 。
属性 name, package, type を持つオブジェクト。
Akhet デモは、 helpers モジュール h 、URL ジェネレーター url 、 セッション変数 session などのような他の変数をすべてのテンプレートに 注入する方法を示しています。
ほとんどのサイトは、すべてのページが同じルックアンドフィール (ヘッダー、 サイドバー、フッター) を持つことを保証するためにページテンプレートと 結合したサイトテンプレートを使用するでしょう。Mako の継承は、サイト テンプレートからページテンプレートを継承することを簡単にします。これは 非常に単純なサイトテンプレートです:
<!DOCTYPE html>
<html>
<head>
<title>My Application</title>
</head>
<body>
<!-- *** BEGIN page content *** -->
${self.body()}
<!-- *** END page content ***-->
</body>
</html>
... また、それを使用するページテンプレートは:
<%inherit file="/site.html" />
<p>
Welcome to <strong>${project}</strong>, an application ...
</p>
より精巧な例が Akhet デモの中にあります。