2012-01-11 1 views
1

오래된 학교 webapp에서 app.yaml 기반 라우팅을 사용하면 정규식을 확인할 수 있으며 일치하는 경우 찾은 패턴을 기반으로 이름을 가진 핸들러에서 요청을 처리합니다. 예를 들어 일치하는 패턴이 'user'이면 \ 1_handler.py가 user_handler.py로 전달됩니다.고급 Webapp2 라우팅

webapp2.Route에서 동일한 작업을 수행 할 수있는 방법이 있습니까? 게으른 처리기 또는 method_handler 매개 변수는 템플릿의 일치 패턴을 기반으로 할 수 있습니까?

+1

여기에는 app.yaml과 웹 프레임 워크라는 두 가지 다른 것들이 있습니다. webapp2와 함께 app.yaml 기반 라우팅을 계속 사용할 수 있습니다. –

+0

예 알아요. 하지만 내가 원하는 것은 URL의 내용에 기반한 요청 처리기 클래스에서 다른 메소드로 요청을 처리하도록하는 것입니다. 그래서 그것은 사용자/쇼 내가 가고 싶은 경우 처리기 : 쇼 및 사용자/추가 사용자 : 이동하려면 추가 할 경우 추가하십시오. 3 가지 유형의 엔티티 (사용자 + 2)와 5 가지 유형의 작업에 대해이 작업을 수행하고 있습니다. ineebapp2의 15 개 노선에서이 작업을 수행 할 수 있습니다. 하지만 3이나 1로 좁힐 수있는 방법을보고 있습니다. app.yaml 정의를 통해 내가 metho를 정의하는 방법을 알 수 없습니다. –

+0

그럴 수는 없지만 원래 질문에서 묻고있는 것이 아닙니다. 나는 그게 어떻게 연관되어 있는지 모르겠다. –

답변

4

webapp2에서는 이와 같이 경로를 지정할 수 없습니다. 가장 합리적인 해결책은 webapp2.Router에 대한 사용자 지정 디스패처를 작성하는 것입니다.

그것은이 같은 사용자 정의 디스패처 설정할 수 있습니다 : 여기

app = WSGIApplication(...) 
app.router.set_dispatcher(custom_dispatcher) 

발송자에 대한 스케치 테스트하지 않는 입니다, 코드는 webapp2.Router.default_dispatcher을 기반으로합니다

from webapp2 import import_string 

def custom_dispatcher(router, request, response): 
    route, args, kwargs = rv = router.match(request) 
    request.route, request.route_args, request.route_kwargs = rv 

    handler = route.handler 
    if isinstance(handler, basestring): 

     handler, args, kwargs = _parse_handler_template(handler, args, kwargs) 

     if handler not in self.handlers: 
      router.handlers[handler] = handler = import_string(handler) 
     else: 
      handler = router.handlers[handler] 

    return router.adapt(handler)(request, response) 

def _parse_handler_template(handler, args, kwargs): 
    """replace {key} in `handler` with values from `args` or `kwargs`. 
    Replaced values are removed from args/kwargs.""" 
    args = list(args) 
    kwargs = dict(kwargs) 
    def sub(match): 
     if kwargs: 
      return kwargs.pop(match.group().strip('{}')) 
     else: 
      return args.pop(int(match.group().strip('{}')) 
    return re.sub('{.*?}', sub, handler), args, kwargs 

이 코드는 허용해야 다음과 같은 규칙을 등록하십시오 :

app = WSGIApplication([ 
    (r'module/<module>/<action>/<argument>', 'modules.{module}.action_{action}'), 
]) 

이 예에서는 메서드 이름에 pattern의 변수를 사용할 수 없습니다 (예 : module.Class:action_{method}). Route 클래스에서이 끝점은 세미콜론으로 구분되며 route.method_nameroute.handler에 저장된 값입니다.