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

#FIXME

nyarlaが大体

Scrapbox.io でコメントや意見を書く