The Publisher handler locates and imports the module specified in the URI. The module location is determined from the req.filename attribute. Before importing, the file extension, if any, is discarded.

If req.filename is empty, the module name defaults to "index".

Once module is imported, the remaining part of the URI up to the beginning of any query data (a.k.a. PATH_INFO) is used to find an object within the module. The Publisher handler traverses the path, one element at a time from left to right, mapping the elements to Python object within the module.

If no path_info was given in the URL, the Publisher handler will use the default value of "index". If the last element is an object inside a module, and the one immediately preceding it is a directory (i.e. no module name is given), then the module name will also default to "index".

The traversal will stop and HTTP_NOT_FOUND will be returned to the client if:

  • Any of the traversed object's names begin with an underscore ("_"). Use underscores to protect objects that should not be accessible from the web.

  • A module is encountered. Published objects cannot be modules for security reasons.

If an object in the path could not be found, HTTP_NOT_FOUND is returned to the client.

For example, given the following configuration:

  DocumentRoot /some/dir

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

And the following /some/dir/index.py file:

  def index(req):

  return "We are in index()"

  def hello(req):

  return "We are in hello()"


http://www.somehost/index/index will return "We are in index()"

http://www.somehost/index/ will return "We are in index()"

http://www.somehost/index/hello will return "We are in hello()"

http://www.somehost/hello will return "We are in hello()"

http://www.somehost/spam will return "404 Not Found"

What is this????