テンプレートエンジンを試してみる

みんなのPython Webアプリ編 [みんなのシリーズ] Chapter9の「テンプレートエンジン」のところまで到達。
テンプレートエンジンの原理は分かったつもりになれたので、stringモジュールに含まれるTemplateクラスを使って実際にやってみる。これまで、モジュールの中にPythonコードとHTMLが混在していたのを分離してコードを見やすくすることを目的とする。
クライアント側の画面は以下のHTMLファイルを表示する。

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
  <form action="/cgi-bin/idandpassdb2.py" method="POST">
    Input user ID and password<br />
    <input type="text"     name="usrid"  size="10" maxlength="10"/><br />
    <input type="password" name="passwd" size="10" maxlength="10"/>
    <br />
    <input type="submit" name="submit" />
  </form>
</body>
</html>

ユーザがusridとpasswdという2つの情報を入力して、submitする。サーバ側の処理は、以下のスクリプト(idandpassdb2.py)が行う。

#!/usr/bin/env python

import cgi
from os import path
from string import Template

form = cgi.FieldStorage()
userid = form.getvalue('usrid', '')
userps = form.getvalue('passwd', '')

dat={}
dat['data1'] = userid
dat['data2'] = userps

f=open(path.join(path.dirname(__file__), 'idandpassform.html'))
t=Template(f.read())
body = t.substitute(dat)

print "Content-type: text/html\n"
print body

入力された情報を返して画面に表示するだけなんだが...。使用するテンプレートは、以下のidandpassform.html。

<html>
<body>
  received id      : ${data1}<br />
           password: ${data2}
</body>
</html>

これでうまくいくのだが、スクリプトの中の

print "Content-type: text/html\n"

の行が邪魔だよな。ヘッダの部分に当たるのだろうけど、これをテンプレートファイルに移動させると(テンプレートにヘッダを書き込むと)エラーになって表示できない。あと一歩なのだが、まだまだ基本的なところの理解が足りないということだな。これはこれとして、次、Chapter10へ。