2012-01-01 3 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, 
     } 
    } 

는, 정적 파일들이 정상적으로 작동 I, 그들은 더 이상 내 자신을 사용하지 그러나, 여기에 디스패처와 설정은 작업. 디스패처에서 디버깅을 수행하면 정적 파일은 디스패처를 통과합니다. '/'만 사용하면 디스패처가 사용됩니다.

답변

2

나는 cherrypy에 익숙하지 않지만 분명히 보인다./static의 모든 것이 /에 있기 때문에 어떤 config 항목을 사용할지 추측 할 수있다. 나는 "더 구체적인 것은 우선 순위가있다"고 희망하지만, 귀하의 설명에 따르면, 이것은 그렇지 않습니다. 문서를 보더라도 도움이되지 않습니다. 모호한 경로 처리에 대한 언급은 없습니다.

주문을 변경하면 도움이 될 것이라고 생각하지만, 사전이므로 주문이 보존되지 않습니다.

cherrypy는 이것을 할 수없는 것 같습니다. 기본 디스패처에 다른 사람이 오버로드되어 있으면 문제가 해결 될 수 있습니다. 또 다른 옵션은 사용자 지정 발송자가 경로를 발견하면 정적 발송자에게 전화를 걸 수 있다는 것입니다.

마지막으로 "경로에 응용 프로그램 탑재"에 대한 설명서가 나와 있습니다. 이 작업을 수행하면 주문을 변경할 수 있습니다. 이 작업을 수행하지 않으면 자동으로 수행되고 수동으로 수행하면 문제가 해결 될 수 있습니다.

내가 쓴대로 나는 cherrypy에 익숙하지 않기 때문에이 모든 내용이 의미가있을 수는 없지만 어쨌든 도움이되기를 바랍니다.

관련 문제