[mod_python] How to make a handler for static files?

Scott Chapman scott_list at mischko.com
Mon Feb 27 04:58:01 EST 2006


Scott Chapman wrote:
> Hi all!
> 
> I want to make a funky handler for static files.  It should return the 
> requested static file if it's in the directory requested.  If it's not 
> there, it should move up a directory and try there.
Well,
Here's what I came up with in the code and it works great.  It doesn't handle 
logging issues but it's step #1.  It looks first in the site specific directory 
then in the shared directory.  I had the spec "backwards" above.

> '''This little handler receives requests for files that would normally be sent statically.
> If the file requested is in /images, and the sites internal name is "mischko" then it will look in:
> /images/mischko for the file.  If it's not there, it will look in /images for it.
> 
> This allows a site to have custom versions of things and if it doesn't, use the shared versions.
> It also allows the site to have a template that is happily ignorant of the situation.'''
> 
> from mod_python import apache
> import os
> import psycopg2
> 
> def parse_uri(uri):
>     uri_list = uri.split('/')
>     uri_list.insert(0,'')
>     uri_list=uri_list[-3:]
>     return uri_list
> 
> def _getInternalName(alias):
>         _conn = psycopg2.connect("user=foo dbname=bar host=127.0.0.1 password=barfoo")
>         _cursor = _conn.cursor()
>         query = "SELECT hostname FROM host_aliases WHERE external_name = %s"
>         parms = [alias]
>         _cursor.execute(query, parms)
>         rval = _cursor.fetchone()
>         if rval:
>             rval = rval[0]
>         _conn.rollback()
>         _conn.close()
>         return (rval)
> 
> def handler(req):
>     def _log(message):
>         req.log_error(message)
> 
>     debug = True
> 
>     (subsite, moduleName, methodName)= parse_uri(req.uri)
>     internalName = _getInternalName(req.hostname)
>     if subsite:
>         internalName = _getInternalName(subsite)
> 
>     if not internalName:
>         if debug: _log('static_handler - illegal host name')
>         raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND
> 
>     orig_path = req.filename
> 
>     (path, filename) = os.path.split(req.filename)
>     new_path = os.path.normpath(path + '/' + internalName + '/' + filename)
> 
>     if os.path.exists(new_path):
>         use_path = new_path
>     elif os.path.exists(orig_path):
>         use_path = orig_path
>     else:
>         raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND
> 
>     if debug: _log('static_handler - used path: %s' % use_path)
> 
>     req.sendfile(use_path)
>     return apache.OK


-- 
q: Why do so many people take an instant dislike to MySQL and PHP?
a: It saves time.
ps: Use PostgreSQL and Python instead.


More information about the Mod_python mailing list