Mako template engine on Google App Engineでmemcacheを使う方法、試作編

読了まで:約2分


概要: 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)の部分で、モジュールmemcachegoogle.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_typememcachedに指定する、という所でしょうか。 当然のことですが、このcache_typefileとかにすると、Google App Engine では動きません。

で、ポイントさえ押さえれば、あとは普通にmakoを使えば良いっぽいです。

んで一応注意しておくと、ローカルの環境で、makoを使ったテンプレートエンジンクラスを、 noseNoseGAEを使ってテストした限りでは特に問題なく動きましたが、 実際の GAE 環境ではテストしていないので、本当に実環境で動くかどうかはよくわかりません。 が、ローカルの環境では動いてるように見えるので、多分大丈夫だとは思います。

というわけでmakoで Google App Engine のmemcacheを使ったキャッシュを行うという話でした。

#FIXME

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。