カラクリサイクル

『輝かしい青春』なんて失かった人の雑記

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

概要: 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を使ったキャッシュを行うという話でした。