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

風柳メモ

ソフトウェア・プログラミング関連の覚書が中心。

Jinja2のテンプレートってコンパイルできたんだ…(恥)

ドキュメントにはきちんと目を通そうという話

以前にパフォーマンス度外視で突貫で作ったシステムのボトルネックを調べていたら*1、固定的にテンプレートエンジンによるレンダリングが1〜2秒かかっていることに気づく。


あれ、Jinja2って、そんなに遅くなかったはず…。


と思っていたら、Envirionmentオブジェクト作成時に Bytecode Cacheを設定していなかった…。

from jinja2 import Environment, FileSystemLoader, FileSystemBytecodeCache

def guess_autoescape(template_name): #{
  if template_name is None or '.' not in template_name: return False
  ext = template_name.rsplit('.', 1)[1]
  return ext in ('html', 'htm', 'xml', 'tpl')
#} // end of guess_autoescape()

jinja2env = Environment(
  loader=FileSystemLoader(<テンプレートのパス>),
  extensions=['jinja2.ext.autoescape'],
  autoescape=guess_autoescape,
  bytecode_cache=FileSystemBytecodeCache(directory=<キャッシュのパス>, pattern='%s.cache')
)

こんな感じで設定してやったら、一気に改善された(1〜2秒かかっていたレンダリングが0.1秒未満に)。


ちなみに、調べている過程で、MarkupSafeを import すればよい、という記述もみられたが、

As of version 2.7 Jinja2 depends on the MarkupSafe module. If you install Jinja2 via pip or easy_install it will be installed automatically for you.

MarkupSafe Dependency

ということなので、Jinja2==2.7 以上ではそもそも必須になっている模様。
pip か easy_install を使ってインストールした場合は、自動的に MarkupSafe が入る。

*1:一番のボトルネックはやはりDBの処理だったがこの記事の趣旨ではないので割愛。