2012-01-01 73 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,但我希望它可以幫助你一點。