/note/tech

jinja2にヘルパー関数を持たせたい

jinja2 のテンプレート内でちょっとした処理をしたいことがあり、色々調べてみたところ、テンプレート変数に関数オブジェクト(もしくはモジュール)を直接渡しておくのが一番楽だった。

↓みたいなイメージ。テンプレート内で helper() と呼び出してやればよい。

def fnc(params):
  return #なんかの処理

values = {'text': '出力するデータ'}
env = Environment(loader=FileSystemLoader('/path/to/template_dir', encoding='utf8'))
template = env.get_template('template_file')
return template.render(values=values, helper=fnc)

マクロは使えば使うほど保守性が下がりそうだし、カスタムフィルタも組み込み方がいまいち美しくないので気分が萎える。かと言ってExtensionを書くのは大げさすぎるしと言った感じで悩んでいたので、この位がちょうどよかった。

参考