使用CherryPy延迟声明静态文件/文件夹

时间:2011-04-10 17:53:40

标签: python static cherrypy

我有一个CherryPy应用程序服务于两个网站,每个网站的静态文件存储在我的app文件夹的相应子文件夹中(每个子文件夹都以相应的域名命名)。在我的主要顶级程序(Main.py)中,该站点已启动 cherrypy.quickstart(Root(), '/',config='cherrypy.cfg')。到目前为止一切都很好......

我遇到的问题是config.cfg中的静态声明,通常以

开头
[/]
tools.staticdir.root = '/domain name/root/static/folder'
tools.staticdir.on = True
tools.staticdir.dir = ''

[/css]
tools.staticdir.on = True
tools.staticdir.dir = 'css'

然而,当时的应用程序。启动,我不知道tools.staticdir.root文件夹的价值,直到我收到请求,然后我可以评估域名(通过.sherrypy.request.base)然后相应地设置默认的子文件夹路径和根文件夹

所以问题是,我可以“推迟”声明我的静态文件/文件夹,直到我的Index()方法被调用(如果是这样,怎么样?),或者只能在cherrypy.quickstart()时声明它们运行

TIA, 艾伦

1 个答案:

答案 0 :(得分:1)

所有工具都只是带有一些配置糖的callables,所以你可以通过以下方式推迟到你的索引方法:

def index(self, ...):
    root = my_domain_map[cherrypy.request.headers['Host']]
    cherrypy.lib.staticdir(section='', dir='', root=root)
    # And then this funky hack...
    return cherrypy.response.body
index.exposed = True

...或者只是致电cherrypy.lib.static.serve_file,这是更低级别的......

...但是有一种更加综合的方式。在进入index方法之前,确实在调用staticdir Tool之前设置root参数。它在before_handler挂钩中调用(优先级为50;较低的数字首先运行)。所以,你想在那之前的某个地方检查你的主机头;让我们选择优先级30:

def staticroot(debug=False):
    root = my_domain_map[cherrypy.request.headers['Host']]
    cherrypy.request.toolmaps['tools']['staticdir']['root'] = root
cherrypy.tools.staticroot = cherrypy.Tool(
    staticroot, point='before_handler', priority=30)

然后,在配置中启用新工具:

[/]
tools.staticroot.on = True

......并给它一个旋转。