[mod_python] Vampire ErrorDocument

Graham Dumpleton grahamd at dscpl.com.au
Fri Nov 11 22:47:39 EST 2005


On 12/11/2005, at 8:29 AM, Brandon N wrote:

> Ive had some good luck coming to terms with Apache/mod_python/ 
> Vampire but I've run into a snag.
>
> How does one setup an "ErrorDocument 404 /404.py" with a Vampire/ 
> mod_python file? All my attempts (basically the first tutorial  
> handler_html etc) are met with:
> The requested URL /something.html was not found on this server.
>
> Additionally, a 403 Forbidden error was encountered while trying to  
> use an ErrorDocument to handle the request.
>
> Any ideas?
Vampire imposes the ideal that URLs should never use a .py extension,  
thereby
ensuring that the fact that Python is being used isn't obvious. This  
extends to
internally redirected URLs such as that specified for ErrorDocument.  
Thus, for
starters don't specify "/404.py" as the target URL for ErrorDocument.

For an error document call "404.py" containing:

   from mod_python import apache

   def handler(req):
     req.status = apache.HTTP_NOT_FOUND
     req.content_type = 'text/html'
     req.write("<html><body><p>NOT FOUND</p></body></html>")
     return apache.DONE

Use an Apache configuration of:

   Options -MultiViews
   ErrorDocument 404 /~grahamd/vampire/404

Ie., no extension on ErrorDocument URL, so handler function is called  
"handler()".
Adjust actual location component of URL as appropriate.

Note that in this case it is extra important that the Apache  
MultiViews options is
disabled. It is recommended that this be disabled whenever using  
Vampire anyway,
or at least when you want URLs with no extension.

Alternatively, instead of calling it "handler()", call it  
"handler_html()" and use:

   ErrorDocument 404 /~grahamd/vampire/404.html

Presuming that is that it returns HTML, else it wouldn't really make  
sense to use that
extension.

BTW, have explicitly set req.status, but this is probably not  
actually required as
Apache knows it is a 404 error already and has therefore set it. I  
have returned
apache.DONE instead of apache.OK just to ensure no extra phases are  
somehow
executed after the handler is executed to serve up the error document.

Anyway, see how that goes.

Graham



More information about the Mod_python mailing list