5.1.1 Python*Handlerディレクティブ構文

リクエストハンドラのディレクティブは全て次のような構文になります:

Python*Handler handler [handler ...] [ | .ext [.ext ...] ]

handler は呼び出し可能オブジェクトで、単一の引数、リクエストオブジェクトを とります。.ext はファイルの拡張子です。

一つの行には複数のハンドラを指定できます。この場合、各ハンドラは左から右へ順に 呼ばれてゆきます。同じハンドラの設定を複数回指定でき、これも同じ結果を返します; すなわち、全てのハンドラが最初から最後まで順次実行されてゆきます。 ハンドラ列のうちいずれかがapache.OK以外の値を返すと、それ以降の ハンドラの実行は中止されます。

ハンドラリストの後ろには、|を続け、その後ろにファイル拡張子を 複数個指定できます。この指定を行うと、該当するファイル拡張子に対してのみ ハンドラが実行されるよう制限します。この機能は trans フェイズ後に 実行されるハンドラにのみ適用されます。

handler は次のような文法になります:

module[::object]

module は完全なモジュール名 (パッケージ名のドット表記も利用できます) で、オプションのobject はモジュール内のオブジェクト名です。

オブジェクトの指定にもドット(.)を含められます。この場合、左から右に名前解決 を行ってゆきます。解決処理中に<class>型のオブジェクトに遭遇すると、 mod_pythonはリクエストオブジェクトを引数にしてクラスの インスタンスを生成しようとします。

オブジェクト名を指定しない場合、ハンドラのディレクティブ名をすべて小文字にし、 先頭の"python" を除いた名前をデフォルトとして使います。 例えば、"PythonAuthenHandler" に対するデフォルトのオブジェクト名は "authenhandler" になります。

例:

  PythonAuthzHandler mypackage.mymodule::checkallowed

ハンドラの詳細については「ハンドラの概要」を参照してください。

補足: "::" を使っているのはパフォーマンス上の理由からです。 Python は、モジュール内のオブジェクトを使用する場合、まず最初に モジュールを import しておく必要があります。区切りを単に"."にしてしまうと、各語がパッケージ、モジュール、クラス等のいずれかを 順に決めるプロセスがかなり複雑になってしまいます。 そこで、(Pythonらしくない)"::"を使うことで、モジュールを指定する 部分がどこで終わり、モジュール内のオブジェクトの指定がどこから始まるのかを 判定するためにかかる時間を mod_python から省き、パフォーマンスを 十分に稼いでいるのです。