[mod_python] transhandler setup?

Graham Dumpleton grahamd at dscpl.com.au
Thu Sep 1 21:39:08 EDT 2005

IR labs wrote ..
> Hi,
> I am not sure whether I should start a new thread, but my issues are 
> not yet solved and the subject line is still partly accurate, so I'll 
> just continue.
> To get my ideas working, I tried both the options that I saw in my last
> post, but I am getting stuck in both.
> Let me start with the one, with which I progressed the most:
> 1. Don't use transhandler. Have a main.py as the PythonHandler for the
> www/root directory.
> <Directory /var/www/root>
>      SetHandler mod_python
>      PythonHandler main
> </Directory>
> ---- with main.py: ----
> def handler(req):
> 	extension = os.path.splitext(req.filename)[1]
> 	if extension == ".html" or extension == "":
> 		if not os.path.exists(req.filename):
> 			... (handle further)
> 			return apache.OK
> 		else:
> 			if extension == '':
> 				req.filename = req.filename + "/index.html" # THIS LINE SEEMS NOT

Correct, it will not. You need to do an internal or external redirect to the URI
corresponding to what you want. For external redirect, you probably want:

  from mod_python import util

This will send back a status to the browser to tell it to look in the alternate

For an internal redirect, you probably want:


This will not send a response back to the browser and it will managed internal
to Apache. The downside of this approach is that the same page is returned
under two different URLs, as index.html can also be accessed directly. This
confuses the results of search engines.

> 			return apache.DECLINED
> 	else:
> 		return apache.DECLINED
> When a url is requested for an existent .html file, it works fine: 
> apache serves the .html file itself. However if the url is only the 
> name of a directory, I can't seem to give apache its normal –complete–
> behavior. (E.g. the url www.foobar.com/foo/ (assuming the directory 
> foo/ exists) does not return a directory listing of the contents of 
> that directory nor does it display www.foobar.com/foo/index.html if 
> there is such a file.) And it seems I also can't change the filename 
> anymore in that handler phase. The only solution I found was to put an
> .htaccess file in /foo/ saying "SetHandler none". But I was actually 
> looking for a way in which I would not need these .htaccess files when
> there is just an index.html present. Is there any way I still can set 
> the filename in this phase?
> Then I thought that maybe transhandler could help me in the end, but I
> got stuck with that one rather soon.
> 2. Using transhandler to set the filename and have it decide what 
> apache should be doing.
> <IfModule mod_python.c>
>      PythonPath "sys.path + ['/var/www/python/']"
>      PythonTransHandler translate

Try adding here in addition to the above:

  AddHandler mod_python .py
  PythonHandler main

Ie., rather than trying to use req.add_handler(). What happens then?

> </IfModule>
> ---- and from translate.py: ----
> def transhandler(req):
> 	...
> 	req.filename = '/var/www/python/main.py'
> 	return apache.OK
> The issue I run against is that now apache shows the code from main.py.
> It doesn't execute it, it just shows the code. Despite all the other 
> directives I use (in httpd.conf or .htaccess). Even when I add the line
> 'req.add_handler("PythonHandler", "main")' to the mix, it won't execute
> main.py, just displays its code. Any ideas how to I solve this?
> Many thanks,
> dirk
> On 31-aug-05, at 00:49, Graham Dumpleton wrote:
> >
> > On 31/08/2005, at 5:44 AM, IR labs wrote:
> >>
> >> But thanks for this solution to have everything (also the stuff we 
> >> don't want to handle) handled by the handler in main.py.
> >> My only remaining question now, would be what you recommend?
> >> 1. Don't use the transhandle phase, and have *all* requests handled
> >> by the main PythonHandler, including the ones it shouldn't handle (
> >> apache.DECLINE)
> >> or.
> >> 2. Use the TransHandler phase to discern between real physical 
> >> present files (requests for .html, .css, .js etc. files) and virtual
> >> pages that should be handled by main.py
> >
> > It all depends on exactly what you want to do, as these probably aren't
> > the only alternatives. If you want a request against a directory to be
> > rerouted, look at the DirectoryIndex directive. If you want to reroute
> > a
> > request against a non existent file based on a specific extension type,
> > you may also be able to use mod_rewrite. Finally, there is also the
> > ErrorDocument directive for non existent files as well. All of these
> > might feasibly be harnessed to provide part of the solution and using
> > Python to make the decision may be a more complicated choice than some
> > of Apache's core features designed for this sort of thing.
> >
> > Graham
> >
> >
> >
> -----------------------------
> Dirk van Oosterbosch
> dirk at ixopusada.com
> -----------------------------
> _______________________________________________
> Mod_python mailing list
> Mod_python at modpython.org
> http://mailman.modpython.org/mailman/listinfo/mod_python

More information about the Mod_python mailing list