この節では、mod_python の詳細に深くつっこまなくても使い始められる publisher ハンドラの概要について手短に説明します。 mod_python ハンドラの動作する仕組みや、ハンドラとは一体何なのかについては、 チュートリアル以後の節で詳しく説明します。
publisher ハンドラは mod_python の標準ハンドラの一つとして提供されています。
このハンドラを使えるようにするには、設定ファイルに以下のように書く必要があります:
AddHandler mod_python .py PythonHandler mod_python.publisher PythonDebug On
さて、下記はフィードバックを送信する簡単なフォームの例です。このフォームは 名前、電子メールアドレス、そしてコメントをユーザに入力してもらい、その情報を 元にウェブ管理者宛の電子メールを生成します。 このシンプルなアプリケーションは、 form.html - データを集めるためのフォーム、そして form.py - フォームのアクション時のターゲット、という 二つのファイルからなります:
フォームの HTML ソースを以下に示します:
<html>
フィードバックを入力して送ってください:
<p>
<form action="form.py/email" method="POST">
Name: <input type="text" name="name"><br>
Email: <input type="text" name="email"><br>
Comment: <textarea name="comment" rows=4 cols=20></textarea><br>
<input type="submit">
</form>
</html>
<form> タグのaction 要素が form.py/email を
指していることに注意してください。次に以下のような内容で form.py
という名前のファイルを作成しましょう:
import smtplib
WEBMASTER = "webmaster" # webmaster e-mail
SMTP_SERVER = "localhost" # your SMTP server
def email(req, name, email, comment):
# ユーザが全ての情報を入力したか確かめる
if not (name and email and comment):
return "必要な情報が入力されていません。戻って正しく入力してください。"
# メッセージテキストを作成する
msg = """\
From: %s
Subject: feedback
To: %s
コメントです:
%s
それでは。
%s
""" % (email, WEBMASTER, comment, name)
# 送信する
conn = smtplib.SMTP(SMTP_SERVER)
conn.sendmail(email, [WEBMASTER], msg)
conn.quit()
# ユーザにフィードバックの内容を返す
s = """\
<html>
%s さん<br>
コメントありがとうございました。すぐにお返事いたします。
</html>""" % name
return s
ユーザが「送信 (Submit)」ボタンを♂と、publisher ハンドラは
フォームの各フィールドの情報をキーワード引数にしてform
モジュール内の関数email を呼び出します。
また、request オブジェクトも req 引数として渡します。
必要がなければ、req すら関数の引数にして渡す必要はありません。
publisher ハンドラは賢くて、関数が受け取れる引数だけを渡します。
データは関数の戻り値を介してブラウザに戻されます。
publisher ハンドラは、 mod_python を使ったプログラム作成を大幅に単純化
しながらも、request オブジェクトにアクセスできるためにmod_python の
全てのパワーを引き出せるようになっています。 publisher ハンドラでは、
「ネイティブの」mod_python ハンドラを使ってできる全てのこと、例えば
req.headers_out を介したカスタムヘッダを作成したり、
apache.SERVER_ERROR 例外を送出してエラーを返したり、
req.write() や req.read() を使ってクライアントとの
間で直接データを読み書きしたり、などといった処理を行えます。
publisher ハンドラの詳しい情報は 6.1publisher ハンドラ を参照してください。