Google App Engine のテンプレートでカスタムフィルタを使う

Google App Engine のテンプレートで、カスタムフィルターを使う方法。

フォルダ構成はこんな感じ。

root
│  app.yaml
│  
├─apps
│  │  __init__.py
│  │  
│  └─frontend
│      │  main.py
│      │  __init__.py
│      │  
│      ├─lib
│      │      custom_filters.py
│      │      __init__.py
│      │     
│      └─template
│              index.html
│              show.html
│              
└─lib
        model.py
        __init__.py


カスタムフィルターは、apps.frontend.lib.custom_filters モジュールに定義されている。
リクエストハンドラは、apps.frontend.main モジュールの中。

まずは、テンプレートライブラリにカスタムフィルタのモジュールを登録する。

apps/frontend/main.py
from google.appengine.ext.webapp import template
webapp.template.register_template_library('apps.frontend.lib.custom_filters')

そして、カスタムフィルタモジュールの中で、フィルタを登録する。

apps/frontend/lib/custom_fliters.py
from google.appengine.ext import webapp
register = webapp.template.create_template_register()

@register.filter
def append(value, arg):
    return value + arg

これで、カスタムフィルタの準備は完了。
テンプレートでいきなり使える。

テンプレート内で load タグを使う必要はない。


ふ~・・・
長かった。

Django と gae のカラミがいまいちよく分からない。

カスタムフィルタを使う方法を探していたら、Django の設定をハッキングするような手法が数多く見つかった。
ひととおり試したが、どれもうまくいかなかった。

ここで上げた方法は、動作はしたが、実行パフォーマンスにムダがある。
不要なときであってもカスタムフィルタをロードしてしまう。
リクエストハンドラの中で、いちいち必要なフィルタモジュールだけを登録する、という方法も考えられるが、それだとコントローラとビューの分離がアヤしくなってくる。

Django では、テンプレート中に load タグを使えば、この問題は避けられる。
GAE には、この load タグに相当するような方法が用意されているのだろうか。


逆引き辞書的なモノが欲しくなってくるね。
Ruby レシピブックみたいな。

2012年11月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

アーカイブ