6.1.2.1 トラバース

publisher ハンドラは URI に指定されたモジュールを探して import します。 モジュールの位置は req.filename 属性で決まります。 ファイル拡張子がある場合、 import を行う前に無視します。

req.filename が空の場合、モジュール名はデフォルト値の"index"になります。 "index".

モジュールを import すると、URI の残りの部分からクエリデータ (いわゆる PATH_INFO) までの間の部分を使ってモジュール内のオブジェクトを探します。 publisher ハンドラは各要素をモジュール内のPython オブジェクトに対応づけ ながら、パスの要素を左から右にひとつづつトラバース(traverse) します。

URL に PATH_INFO がない場合、publisher ハンドラは"index"をデフォルト値に使います。パスの最後の要素がモジュール内のオブジェクト名で、 かつその前にある要素がディレクトリ名の場合 (モジュール名が指定されて いない場合)、モジュール名はデフォルト値の "index" になります。

以下のような場合にはトラバースを停止してHTTP_NOT_FOUND を返します:

パス上にオブジェクトが見つからなかった場合、クライアントに HTTP_NOT_FOUND を返します。

例えば、以下のような設定があるとしましょう:

  DocumentRoot /some/dir

  <Directory /some/dir>
  SetHandler mod_python
  PythonHandler mod_python.publisher
  </Directory>

そして、以下のようなファイル/some/dir/index.py があったとします:

  def index(req):

  return "We are in index()"

  def hello(req):

  return "We are in hello()"

URI と結果は次のようになります:

http://www.somehost/index/index は "We are in index()" になります。

http://www.somehost/index/ は "We are in index()"になります。

http://www.somehost/index/hello は "We are in hello()"になります。

http://www.somehost/hello は "We are in hello()"になります。

http://www.somehost/spam は "404 Not Found"になります。