我编写了自己的自定义调度程序,它使用正则表达式映射路由,但是,我无法在/ static中托管静态文件。这是调度程序和配置:
class Dispatcher(object):
def __init__(self):
self.urls = {}
def __call__(self, path_info):
print('Dispatcher called: ' + path_info)
func = self.find_handler(path_info)
cherrypy.serving.request.handler = func
def find_handler(self, path_info):
request = cherrypy.serving.request
request.config = cherrypy.config.copy()
for url in self.urls:
args = re.findall(url, path_info)
if len(args) > 0:
# in the case that the route is just a URL, we don't want
# an extra argument in the method function
try:
args.remove(path_info)
except ValueError:
pass
controller = self.urls[url]
method = request.method.lower()
return cherrypy._cpdispatch.LateParamPageHandler(getattr(controller, method), *args)
return cherrypy.NotFound()
def connect(self, url, controller):
if not url.endswith("$"):
url += "$"
self.urls[url] = controller
配置:
config = {
'global': {
'server.socket_host': '0.0.0.0',
'server.socket_port': port,
},
'/static': {
'tools.staticdir.on': True,
'tools.staticdir.dir': os.path.join(os.getcwd(), 'static'),
},
'/': {
'request.dispatch': self.dispatcher,
}
}
如果我使用标准调度程序,静态文件可以正常工作,但是如果我使用自己的,它们将不再起作用。在调度程序中完成调试之后,静态文件会通过调度程序,即使我具体说明仅在' /'调度员是否被使用。
答案 0 :(得分:2)
我不熟悉cherrypy,但似乎显而易见:/ static中的所有内容都在/中,因此任何人都猜测它将使用哪个配置条目。我希望“更具体的优先”,但根据你的描述,情况并非如此。查看文档也没有用,没有提到模糊的路径处理。
您会认为更改订单可能会有所帮助,但由于这是一本字典,因此订单不会保留。
似乎cherrypy无法做到这一点。如果它有一个超载的默认调度程序,那么可以解决问题。另一个选择是,如果自定义调度程序检测到路径,则可以调用静态调度程序。
最后,文档讨论了“将应用程序安装到路径上”。如果您这样做,您可能想要更改订单。如果您不这样做,可能会自动完成,手动执行可能会解决您的问题。
并非所有这些都有意义,因为在我写的时候,我对樱桃不熟悉,但我希望它对你有所帮助。