我有一个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, 艾伦
答案 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
......并给它一个旋转。