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

我有一个CherryPy应用程序服务于两个网站,每个网站的静态文件都存储在我的应用程序文件夹的相应子文件夹中(每个子文件夹都以相应的域名命名)。在我的主要顶级程序(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, 艾伦     
已邀请:
所有工具都只是带有一些配置糖的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方法之前设置
root
参数,实际上在调用staticdir Tool之前。它在一个
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
......并给它一个旋转。     

要回复问题请先登录注册