読者です 読者をやめる 読者になる 読者になる

YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

mod_python + GenshiでHTMLを表示してみる

動機

mod_pythonを入れたあとはGenshiとの連携が必要だなと思った。

方法

Genshiの簡単な使い方はここに書いたとおり。

上記のエントリで書いたテンプレートから生成されるHTMLをmod_pythonで表示させてみようと思う。まずhttpd.confの設定から。ここにある感じで設定。

<Directory "/path/to/app">
    AddHandler mod_python .py
    PythonHandler test
    PythonDebug On
</Directory>

で、実行するスクリプトであるtest.pyにはhandler()メソッドを定義してあげる。

from mod_python import apache
from genshi.template import TemplateLoader
import os

TEMPLATE_DIR = os.path.dirname(__file__)
loader = TemplateLoader([TEMPLATE_DIR])
tmpl = loader.load(os.path.join(TEMPLATE_DIR, 'template.html'))

title = 'test'
entries = [{'url':'http://www.google.com','title':'Google'},
           {'url':'http://www.yahoo.com','title':'Yahoo!'},
           {'url':'http://d.hatena.ne.jp/ymotongpoo/','title':'YAMAGUCHI::weblog'}]
stream = tmpl.generate(title=title, entries=entries)

def handler(req):
    req.content_type = 'text/html'
    req.send_http_header()
    req.write(stream.render('html'))
    return apache.OK

ここで注意するのが、TEMPLATE_DIRとかの扱い。フルパスを指定してあげないとちゃんとファイルを読み込めない。もしSQLiteとか使うなら同様に指定してあげないと

OperationalError: unable to open database file

と出てしまいます。
あと、handler()メソッドで最初にContent TypeとHTTPヘッダをきちんと送信しないとテキストがそのままブラウザに表示されてしまうのでコレも注意。
で、http://host.domain/app/test.pyにアクセスすると表示されました。
f:id:ymotongpoo:20081215084345p:image