今天OneZ在pylons mail list上提出了一个叫url prefix的问题,它的意思是在http://localhost:5000/pyapp指向原来http://localhost:5000/的位置,但是在指向public/目录下的静态文件不起作用。ben马上就给出了答案,非常有意思。它要经过一些设置才行,必须在.ini中的[app:main]中设置一个prefix,然后要在config/的目录中的middleware.py,包装一个类似filter的类:

import re
class PrefixWrapper(object):
    def __init__(self, app, prefix):
        self.app = app
        self.prefix = prefix
        self.re_prefix = re.compile(self.prefix + '(.*)')

    def __call__(self, environ, start_response):
        environ['PATH_INFO'] = re.sub(self.re_prefix, r'\1', environ['PATH_INFO'])
        return self.app(environ, start_response)

这个包装器,from paste.urlparser import StaticURLParser,是从这个StaticURLParser这个object演化而来的,注意PrefixWrapper中method的参数与这个是一致的。

并在make_app()中加入:

# @@@ Static Files in public directory @@@
staticapp = StaticURLParser(config.paths['static_files'])
staticapp = PrefixWrapper(staticapp, app_conf['prefix'])

有点类似cherrypy中的filter机制。不过pylons,我感觉更有些意思。这两天与OneZ在网上交流了一些东西,获益匪浅。交流多些,进步多点。也希望有更多的人加入pylons的行列。