2012-01-01 12 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

私はチェリーピーに精通していませんが、明らかです:/ staticのすべてが/にもありますので、どのconfigエントリを使用するかは誰でも推測しています。私は、「より具体的なものが優先」と願っていますが、あなたの説明によれば、そうではありません。ドキュメントも参考になりませんが、あいまいなパス処理については言及していません。

注文を変更すると役立つかもしれませんが、これは辞書なので、注文は保存されません。

チェリーピーはこれをすることができないようです。デフォルトのディスパッチャーに他のものがオーバーロードされている場合は、その問題を解決できます。もう1つの方法は、パスを検出したカスタムディスパッチャが静的パスを呼び出すことです。

最後に、「パスへのアプリケーションのマウント」について説明しています。これを行うと、注文を変更することができます。これを行わないと自動的に実行され、手動で行うと問題が解決する場合があります。

私が書いたように、私はチェリーピーに慣れていないので、これはすべて意味をなさないかもしれませんが、とにかく少しでも助けてくれることを願っています。

関連する問題