DjangoでテンプレートエンジンにGenshiを使うメモ

Djangoの特徴として、テンプレートエンジンをDjango純正のものも含めて自由に選択できることがあります。

デフォルトのテンプレートエンジンはRailsJSPに近い感じでスクリプトとHTMLが混在するようなタイプです。したがって、デザイナとプログラマの分離がやや難しいく、デザインまでプログラマがこなす場合に向いています。他の選択肢としては、幾つかあるのですがTracで有名なedgewallの開発しているテンプレートエンジンにGenshi(原糸)というのがあります。Genshiは最新版のTracでも用いられているテンプレートエンジンで、XML(XHTML)がベースとなります。

今回はチュートリアルやマニュアルから、簡単に使い方を解説してみようと思います。
http://genshi.edgewall.org/

インストール

インストールは、easy_installを導入していれば、以下のコマンドを実行すればOKです。

easy_install Genshi

テンプレートの作成

テンプレートはXML(XHTML)で記述します。文字コードUTF-8にする方が無難でしょう。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:py="http://genshi.edgewall.org/"
      xmlns:xi="http://www.w3.org/2001/XInclude"
      lang="jp" >
<head>
  <title>Genshi</title>
</head>
<body >
<div>
  <h1>${head_line}</h1>
  <ul py:for="msg in messages">
    <li>${msg}</li>
  </ul>
</div>
</body>
</html>

通常のXHTMLとして記述すればOKですが、genshiの機能を使う為の名前空間がhtml宣言で宣言されています。テンプレートはDjangoのテンプレートディレクトリに配置してください。

ポイントはulタグでの繰り返し処理のコードがpy:forというXHTMLの属性で記述されていることです。簡単に予想できるように、このテンプレートのul部分はmessagesを用いてイテレートされ、liタグが繰り返し出力されます。

尚、最近使用したフレームワークJava(JSF)のTeedaがありますが、Teedaではタグの種類とidの命名規則から振る舞いが決まりました。例えば、同様の処理を行うテンプレートはこんな感じになります。

  <ul id="messageItems">
    <li><span id="msg"></span></li>
  </ul>

繰り返し処理を行うタグを使いliタグを囲むパターンが多いのですが、やはり余計なタグがあるよりもない方がスッキリしませんか?

viewから使う

Djangoのデフォルトのテンプレートローダーを使えば、次のようなコードで簡単にGenshiを使うことができます。

from django.http import HttpResponse
from django.template import loader
from genshi.template import MarkupTemplate

def index(request):
    source, origin = loader.find_template_source('index.html');
    template = MarkupTemplate(source)
    doc = template.generate(head_line='Hello Genshi', messages=['A', 'B'])
    return HttpResponse(doc.render('xhtml'))

ポイントというほどでもないですが、genshi.template.MarkupTemplateを使用してテンプレートを作成し、renderメソッドでXHTMLに変換するだけです。