2012-01-01 80 views
2

我已经编写了自己的使用正则表达式映射路由的自定义调度程序,但是,我无法再在/ static中托管静态文件。这里是调度和配置:使用静态文件的Cherrypy自定义调度程序

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, 
     } 
    } 

如果我用的是标准的调度,静态文件的工作,因为他们应该,但如果我用我自己的,他们不再工作。在调度程序中完成调试后,静态文件会通过调度程序,即使我具体指出调度程序只能在'/'中使用。

回答

2

我对cherrypy并不熟悉,但看起来很明显:/ static中的所有内容都在/中,所以任何人都会猜测它将使用哪个配置条目。我希望“更具体优先”,但根据你的描述,情况并非如此。查看文档也无济于事,没有提到模糊的路径处理。

您会认为更改顺序可能会有所帮助,但由于这是一本字典,因此顺序不会保留。

似乎cherrypy无法做到这一点。如果它有一个超载的默认调度程序,那可以解决问题。另一种选择是,如果自定义调度程序检测到路径,则可以调用静态调度程序。

最后,文档讨论了“将应用程序安装到路径”。如果您这样做,您可能需要更改订单。如果您不这样做,可能会自动完成,手动执行可能会解决您的问题。

并非所有这些都有意义,因为正如我写的,我并不熟悉cherrypy,但我希望它可以帮助你一点。

相关问题