基本的なハンドラの書き方を理解したところで、もう少し複雑なものに取り組んで みましょう。
ディレクトリをパスワードで保護したいとしましょう。ログイン名は"spam"、 パスワードは"eggs" にします。
まず、認証が必要な場合に 認証 (authentication) ハンドラを
呼び出すようApache に教えます。PythonAuthenHandler を使います。
従って、設定ファイルは以下のようになります:
<Directory /mywebdir>
AddHandler mod_python .py
PythonHandler myscript
PythonAuthenHandler myscript
PythonDebug On
</Directory>
二つのハンドラに対して同じスクリプトが指定されていることに注意してください。 ご存知のように、mod_python は異なるハンドラに対して異なる 名前の関数をスクリプトから探し出すので、これで構わないのです。
次に、Basic HTTP 認証を使い、有効なユーザだけが許可されるようApache に指示 します(これはかなり基本的なApacheの設定なので、ここでは詳しく説明しません)。 設定ファイルは以下のようになりました:
<Directory /mywebdir>
AddHandler mod_python .py
PythonHandler myscript
PythonAuthenHandler myscript
PythonDebug On
AuthType Basic
AuthName "Restricted Area"
require valid-user
</Directory>
さて、今度は認証のハンドラ関数を myscript.py 内に記述しましょう。 認証ハンドラは以下のようになります:
from mod_python import apache
def authenhandler(req):
pw = req.get_basic_auth_pw()
user = req.user
if user == "spam" and pw == "eggs":
return apache.OK
else:
return apache.HTTP_UNAUTHORIZED
一行づつ見てゆきましょう:
def authenhandler(req):
ハンドラ関数の宣言です。上でも説明したように、mod_python は
ディレクティブの名前 (PythonAuthenHandler)から先頭の"Python" を
落して小文字にした文字列から関数名をとるので、関数名は authenhandler
になります。
pw = req.get_basic_auth_pw()
上記のようにしてパスワードを取得します。 Basic HTTP 認証はパスワードを base64 でエンコードされたフォームで 送信することでほんの僅かだけ分かりにくくして転送します。この関数はパスワードを デコードして、文字列にして返します。この関数はユーザ名を取得する前に呼び出さねば ならないので注意してください。
user = req.user
これでユーザが入力したユーザ名を取得します。
if user == "spam" and pw == "eggs":
return apache.OK
ユーザが入力した値を比較し、期待通りの値なら処理を先に進めてapache.OK
を返すよう Apache に指示します。Apache はこのリクエストのフェイズが完了した
ものとみなし、次のフェイズに進みます (.py ファイルに対する
リクエストであれば、次は handler() を呼び出します)
else:
return apache.HTTP_UNAUTHORIZED
期待通りの値でなければ、Apache はHTTP_UNAUTHORIZED をクライアント に返します。通常、この戻り値を受け取ると、ブラウザはユーザ名とパスワードの入力を 促すダイアログボックスを表示します。