ほんじゃらねっと

ダイエット中プログラマのブログ

Google App Engine でwebappフレームワークとJinja2を使用する

Jinja2の国際化機能が使いたかったので、テンプレートシステムを今まで使っていた
DjangoテンプレートからJinja2に移行した。Kay Framework に移行することも考えたのだけど、
大分作り込んじゃったサイトだったので断念し、テンプレートだけを変更。
移行自体は割とすんなり完了した。(その後の国際化の方が調査するのに大分時間がかかってしまった。)


下記の方法で移行できた。

Jinja2のソースをzip化してプロジェクト内に配置

Jinja2のドキュメントはこちら
http://jinja.pocoo.org/


日本語ドキュメントはこちら
http://ymotongpoo.appspot.com/jinja2_ja/index.html


ソースはこちらからダウンロード
http://pypi.python.org/pypi/Jinja2


tarballを解凍して、中のjinja2フォルダをzip化し、プロジェクト内に配置。


main.py等の起動スクリプト内でパスに追加しておく。

import sys
sys.path.insert(0, 'jinja2.zip')

レスポンス処理を変更

下記のようなレスポンスレンダリング関数を作って使用している。


NullUndefinedは下記の記事を参考にさせてもらい、未定義の変数がある時にエラーが出ないようにしてる。
http://d.hatena.ne.jp/Voluntas/20090418/1240024137


あと、djangoのurlencodeと同様の機能がjinja2にないようなので
werkzeugをzip化してパスに追加して同様の機能を追加してる。

import jinja2
import werkzeug.urls
from google.appengine.ext import webapp
#from google.appengine.ext.webapp import template
from django.template import defaultfilters as django_filters
from project1 import settings
class NullUndefined(jinja2.Undefined):
def __int__(self):
return 0
def __getattr__(self, name):
return u""
def render_response(handler, template_name, params):
# Djangoテンプレートで利用してた処理
#template_path = os.path.join(settings.TEMPLATE_DIR, template_name)
#handler.response.out.write(template.render(template_path, params))
env = jinja2.Environment(
loader=jinja2.FileSystemLoader([settings.TEMPLATE_DIR], encoding="utf8"),
autoescape=True,
undefined=NullUndefined,
extensions=[
'jinja2.ext.with_',
'jinja2.ext.i18n',
]
)
env.filters.update({
"linebreaksbr": django_filters.linebreaksbr,
"urlencode": werkzeug.urls.url_quote_plus,
})
try:
template = env.get_template(template_name)
except jinja2.TemplateNotFound:
raise jinja2.TemplateNotFound(template_name)
handler.response.out.write(template.render(params))

テンプレートの内容をjinja2用に変更

ここはまあ、エラーが出た箇所をチマチマ変更していく、という形で対応しました。