3.1 publisher ハンドラを使ってみる

この節では、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 ハンドラ を参照してください。