最近、というか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を使ったキャッシュを行うという話でした。