概要: Python のテンプレートエンジンmako
で Google App Engine の memcache を使う方法(確証なし)
最近、というか 2,3 日前から Google App Engine で動く大規模掲示板スクリプトを作り始めたんですが、 その掲示板スクリプトで使ってるテンプレートエンジンの mako で、 Google App Engine の memcache を使ってテンプレートのキャッシュをする方法を紹介したいと思います。
で、mako
はキャッシュシステムとして beaker を使ってるらしいんですが、
このbeaker
で Google App Engine の memcache を使うようにすると、mako
を Google App Engine の memcache に対応させられる、
というのが本題です。
まあこの対応の仕方はほぼネットにあった
のコードまんまなんですが、大体こんな感じです。
def patch_beaker():
import sys
import google.appengine.api.memcache
# 1) alias `memcache` = `google.appengine.api.memcache`
sys.modules [['memcache']] = google.appengine.api.memcache
# 2) disable access to local files.
import beaker.ext.memcached
from beaker.synchronization import null_synchronizer
beaker.ext.memcached.verify_directory = lambda x: None
beaker.ext.memcached.MemcachedNamespaceManager.get_creation_lock = lambda x, y: null_synchronizer()
try:
patch_beaker()
except Exception:
raise
一応解説すると、
まず最初の1)
の部分で、モジュールmemcache
をgoogle.appengine.api.memcache
にエイリアスしています。
Google App Engine のmemcache
モジュールは Python のmemcache
モジュールと互換性があるので、
このそのまま代入で多分動きます。
次に2)
の部分ですが、ここではbeaker.ext.memcached
のローカルのファイルにアクセスしている部分をつぶしています。
まあこれも多分うまく動くんでしょう。あんまり検証してませんが。
で、これでbeaker
へのパッチは終了で、今度はmako
のコードに入っていきます。
んで、上記のコードが書いてあった Use beaker and mako with memcache では、
mako
のコードをいじくりまわして対応させてるんですが、元のコードが書かれたのは 2008 年 10 月 23 日で、
その当時のmako
のコードと、2010 年 06 月 18 日現在のmako
のコードとはかなり違っているみたいなので、
当時のコードを現在のmako
に適用しても、当然のことながら動きません。
で、現在のmako
のコードを見てみたのですが、今の mako はbeaker
を使った(と思われる)キャッシュ機構がキチンと備わっており、
そのキャッシュ機構をそのまま使えば問題ないっぽいです。
で、実際の mako 側のコードはこんな感じになります。
from mako.template import Template
from mako.lookup import TemplateLookup
lookup = TemplateLookup(
# temlate dir
directories= [[ '/path/to/template/dir' ]] ,
# enable cache
cached=True,
cache_type='memcached',
cache_urt='memcached://',
)
template = lookup.get_template('template.tmpl')
print template.render(foo='bar')
ポイントとしては、最初に書いたbeaker
へのパッチを有効にした後、
cache_type
をmemcached
に指定する、という所でしょうか。
当然のことですが、このcache_type
をfile
とかにすると、Google App Engine では動きません。
で、ポイントさえ押さえれば、あとは普通にmako
を使えば良いっぽいです。
んで一応注意しておくと、ローカルの環境で、mako
を使ったテンプレートエンジンクラスを、
nose
とNoseGAE
を使ってテストした限りでは特に問題なく動きましたが、
実際の GAE 環境ではテストしていないので、本当に実環境で動くかどうかはよくわかりません。
が、ローカルの環境では動いてるように見えるので、多分大丈夫だとは思います。
というわけでmako
で Google App Engine のmemcache
を使ったキャッシュを行うという話でした。
#FIXME