YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

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