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

アバターアイコン兼ロゴ

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

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

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