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

DjangoテンプレートとGenshiを比較する

これはgumi Engineer's Diaryに書いたものを修正・転載したものです。


はじめに
世の中には、Advent Calendarなるものが存在しているみたいです。
僕は不勉強なのもあって今年になって初めて知りました。
そのうちの一つPython Web フレームワーク アドベントカレンダー にいかがですか?と @terapyonさんに声をかけて頂き、@RyoAbeさんからバトンが回って来たので、何かそれっぽいことを書いてみようかと思います。
とは言え、僕自身はDjango以外のPython Web フレームワークを使った経験があまりないので、今回は前職でちょろっと使っていたGenshiとgumiで使っているDjangoテンプレートの比較をしてみようかなーと考えています。



Djangoテンプレート
そんなわけでDjangoテンプレートです。
Djangoには専用のテンプレートシステムがあります。
詳しくはこの辺を見てください。
Djangoテンプレートだと
変数は

<h1>{{ section.title }}</h1>

条件分岐は

{% if foo %}
  {{ bar }}
{% endif %}

{% for topic in topics %}
<ul>
 <li>{{ topic }}</li>
</ul>
{% endfor %}

みたいに書けます。

書きやすくて便利です!

実際の例はこんな感じ。

{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}
<h1>Hello, ${w}</h1>

{% if b == True &}
<hr color="#00FF00" />
{% else %}
<hr color="#FF0000" />
{% endif %}

<ul>
{% for link_tag in l %}
 <li>{{link_tag}}</li>
{% endfor %}
</ul>
{% endblock %}

書きやすいのですが、制御文がテキストベースなので、構造が入り組んでいるとごちゃっとしていてわかりにくいですし、ブラウザでテンプレートを見てみてもよくわかりません><
gumiではデザイナさんにhtmlのコーディングを頼んでいるのですが、そのためにはデザイナさんにもDjangoにある程度習熟してもらう必要もあって、結構ハードルが高いです。



Genshi
そんな訳でGenshiです。
詳しくはこっちもUser Guideとかを見てもらうとして、ざっと説明すると
変数は

<h1>${ section.title }</h1>

条件分岐は

<b py:if="foo">${bar}</b>

<ul py:for="topic in topics">
 <li>${topic}</li>
</ul>

みたいに書けます。

制御文がテキストベースではなくタグベースですが、Djangoとあまり変わらないですね!

実際の例はこんな感じ。

<html xmlns="http://www.w3.org/1999/xhtml"   
      xmlns:py="http://genshi.edgewall.org/" py:strip=""  
      xmlns:xi="http://www.w3.org/2001/XInclude"  
      >
<head>
</head>
<body>
<h1>Hello, ${w}</h1>

<py:choose test="b()">
<hr py:when="True"  color="#00FF00" />
<hr py:otherwise="" color="#FF0000" />
</py:choose> 

<xi:include href="testapp/include.html" />

<ul py:for="link_tag in l"> 
  <li>${link_tag}</li> 
</ul> 
</body>  
</html>  

タグに制御文を埋め込むのが最初はキモく見えるかもしれませんが、すぐに慣れると思います。
タグに埋め込んである分シンプルでわかりやすいですし、何よりブラウザで見ても普通のhtmlなので、デザイナさんがそのまま作業が出来るのが良いですね!

ただテンプレートが厳密なxmlでなくてはダメです。
前職で使用していた際によくありましたが、<br /> でなく <br> と書いてしまうとエラーが出て怒られるので気をつけてください。



まとめ
Genshiを思い出しながらDjango上で動かしてみましたが、正直一人で手軽に作るのならDjangoテンプレートの方が楽ですね。
Djangoテンプレートに慣れているのもあって、厳密なxmlかどうかとか考えながらhtmlを書くのは面倒でした。
ですが、デザイナーさんやhtmlコーダーさんにテンプレートを修正してもらう場合は、Genshiテンプレートの方が確認等がしやすくて良いのではないかと思います。
専任のデザイナーさんやhtmlコーダーさんがいるような環境ではGenshiを使ってみるのはどうでしょうか?
その際の環境構築には「djangoで、テンプレートエンジンgenshiを使う」を参考にしてみてください!


ネタもなかったので、Genshiの簡単な紹介みたいになってしまいました。。。
日頃からアンテナを張り巡らせたり色々試したりしていないと、こういう時にあたふたとしてしまって良くないですね><
ハードルは下げておいたので、次は@ransuiさんお願いします!