ハンドラ (handler) とは、リクエストにおける特定のフェイズ を処理する関数です。 Apache は一つのリクエストをリクエストの読み込み、 ヘッダの処理、コンテンツの提供、などといった複数のフェイズに分けて処理します。 いずれのフェイズに対しても、Apache のコア機能や、mod_python のように ユーザが Python で書いた関数に処理を渡すモジュール群の中からハンドラを 呼び出します。 Python で書いたハンドラは C で書いたハンドラと全く同じで、 以下のような規則に従います:
ハンドラ関数は常にリクエストオブジェクトへの参照を受け取ります。
(このマニュアル全体を通じて、リクエストオブジェクトはしばしば req という
変数で参照されています。)
各ハンドラは以下のような値を返します:
HTTP_CONTINUE = 100
HTTP_SWITCHING_PROTOCOLS = 101
HTTP_PROCESSING = 102
HTTP_OK = 200
HTTP_CREATED = 201
HTTP_ACCEPTED = 202
HTTP_NON_AUTHORITATIVE = 203
HTTP_NO_CONTENT = 204
HTTP_RESET_CONTENT = 205
HTTP_PARTIAL_CONTENT = 206
HTTP_MULTI_STATUS = 207
HTTP_MULTIPLE_CHOICES = 300
HTTP_MOVED_PERMANENTLY = 301
HTTP_MOVED_TEMPORARILY = 302
HTTP_SEE_OTHER = 303
HTTP_NOT_MODIFIED = 304
HTTP_USE_PROXY = 305
HTTP_TEMPORARY_REDIRECT = 307
HTTP_BAD_REQUEST = 400
HTTP_UNAUTHORIZED = 401
HTTP_PAYMENT_REQUIRED = 402
HTTP_FORBIDDEN = 403
HTTP_NOT_FOUND = 404
HTTP_METHOD_NOT_ALLOWED = 405
HTTP_NOT_ACCEPTABLE = 406
HTTP_PROXY_AUTHENTICATION_REQUIRED= 407
HTTP_REQUEST_TIME_OUT = 408
HTTP_CONFLICT = 409
HTTP_GONE = 410
HTTP_LENGTH_REQUIRED = 411
HTTP_PRECONDITION_FAILED = 412
HTTP_REQUEST_ENTITY_TOO_LARGE = 413
HTTP_REQUEST_URI_TOO_LARGE = 414
HTTP_UNSUPPORTED_MEDIA_TYPE = 415
HTTP_RANGE_NOT_SATISFIABLE = 416
HTTP_EXPECTATION_FAILED = 417
HTTP_UNPROCESSABLE_ENTITY = 422
HTTP_LOCKED = 423
HTTP_FAILED_DEPENDENCY = 424
HTTP_INTERNAL_SERVER_ERROR = 500
HTTP_NOT_IMPLEMENTED = 501
HTTP_BAD_GATEWAY = 502
HTTP_SERVICE_UNAVAILABLE = 503
HTTP_GATEWAY_TIME_OUT = 504
HTTP_VERSION_NOT_SUPPORTED = 505
HTTP_VARIANT_ALSO_VARIES = 506
HTTP_INSUFFICIENT_STORAGE = 507
HTTP_NOT_EXTENDED = 510
ハンドラはHTTP エラーコードを 返す 代わりに、 HTTP エラーコードを例外の値にしてapache.SERVER_RETURN 例外を 送出してエラーをシグナルできます。例えば、
raise apache.SERVER_RETURN, apache.HTTP_FORBIDDEN
ハンドラは req.write() メソッドを使って クライアントにコンテンツを送信できます。
POST リクエスト時のようにいクライアントデータがある場合、データは req.read() 関数を使って読み出せます。
Python*Handler ディレクティブを有効にしているディレクトリは
sys.path のパス中に前置されます。サーバ設定ファイルの<Directory>
外でディレクティブを設定した場合、ディレクトリの位置は分からず、sys.path
にも加えられません。
最小限のハンドラの例は以下のようになります:
from mod_python import apache
def requesthandler(req):
req.content_type = "text/plain"
req.write("Hello World!")
return apache.OK