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用に変更
ここはまあ、エラーが出た箇所をチマチマ変更していく、という形で対応しました。