template lookup errorを見つけるスクリプト

pyramidは、template lookup errorが起き得る状態の設定でもアプリケーションが動作する。
もちろん、動的言語的な性質を考えるとruntime errorというのが正しいという気もしないではないけれど。

デプロイ前後にtemplate lookup errorが発生することが分かると結構へこむ。
直接アクセスして調べるのも手間がかかるので事前に検知したい。

use introspector

pyramid.1.3からintrospectionの機能が強化されている。http://pyramid.readthedocs.org/en/latest/narr/introspector.html
内部的には、add_viewやadd_routeなどで、config.action()が呼ばれる際に登録される。

introspectorは以下のようにして取得することが可能

request.registry.introspector

registryへの参照さえあればconfigからでもrequestからでもアクセスできる。

introspectorは

  • viewの情報
  • templateの情報
  • tweenの情報

など色々な情報を持っている。

introspectorの持っているtemplateの情報を利用することでtemplate lookup errorを検知することができるかもしれない。

実際にやってみた。

以下のようなスクリプトを書けば良かった。

from pyramid.paster import bootstrap
import sys

def detect(renderer):
    return renderer.lookup.get_template(renderer.path)

config_uri = sys.argv[1]
env = bootstrap(config_uri)
registry = env["registry"]


for t in registry.introspector.get_category("templates"):
    try:
        renderer = t["introspectable"]["renderer"]
        if renderer.type == ".mako":
            detect(renderer.renderer)
    except Exception as e:
        print str(e)

bootstrapは"develop.ini"や"production.ini"などの設定ファイルのパスを引数として取り、
渡された設定ファイルで立ち上がったアプリケーション(あるいは環境)を返す関数。
viewなどが登録された状態で返ってくるので、これを利用する。

動作チェック

hello0.mako,hello1.makoは存在していないテンプレート。

$ python detect.py development.ini 
Cant locate template for uri 'hello1.mako'
Cant locate template for uri 'hello0.mako'
Cant locate template for uri 'hello1.mako'
Cant locate template for uri 'hello0.mako'

上のスクリプトは、対応しているのがmakoのテンプレートだけだけれど。
真面目にやればtemplate lookup errorを事前にチェックすることができそう。

動作確認に使ったファイルたち


これらは単独では動かない。今日の別記事を参考に
http://d.hatena.ne.jp/podhmo/20120908/1347106193