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

Graham Dumpleton grahamd at dscpl.com.au
Mon Feb 27 06:29:56 EST 2006


Having a little play, got this to sort of work:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^subdir/([^/]*\.txt?|[^\./]*)[:;,\.]*$ /testing/rewrite/$1 
[L,NS]

Still have to work out how I can get the leading part of the path from 
the
right hand side automatically inserted based on context, rather than 
doing
it manually.

The basic idea though is that if the file doesn't exist, the rewrite 
rule
will convert a request for the nonexistant ".txt" file in the "subdir" 
to
the parent directory, which in this case happens to be 
"/testing/rewrite".

Anyone who understands mod_rewrite able to improve on this for me?

Graham

On 27/02/2006, at 8:44 PM, Graham Dumpleton wrote:

> If your intent is only to serve up static files, you might be better 
> off using
> Apache rewrite rules rather than using mod_python.
>
> I've not got my head around rewrite rules yet, but maybe someone else
> here understand them better and can suggest something to try.
>
> Graham
>
> On 27/02/2006, at 8:58 PM, Scott Chapman wrote:
>
>> 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.
>> _______________________________________________
>> Mod_python mailing list
>> Mod_python at modpython.org
>> http://mailman.modpython.org/mailman/listinfo/mod_python
>
> _______________________________________________
> 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