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_name
및 route.handler
에 저장된 값입니다.
출처
2012-01-11 22:30:45
Ski
여기에는 app.yaml과 웹 프레임 워크라는 두 가지 다른 것들이 있습니다. webapp2와 함께 app.yaml 기반 라우팅을 계속 사용할 수 있습니다. –
예 알아요. 하지만 내가 원하는 것은 URL의 내용에 기반한 요청 처리기 클래스에서 다른 메소드로 요청을 처리하도록하는 것입니다. 그래서 그것은 사용자/쇼 내가 가고 싶은 경우 처리기 : 쇼 및 사용자/추가 사용자 : 이동하려면 추가 할 경우 추가하십시오. 3 가지 유형의 엔티티 (사용자 + 2)와 5 가지 유형의 작업에 대해이 작업을 수행하고 있습니다. ineebapp2의 15 개 노선에서이 작업을 수행 할 수 있습니다. 하지만 3이나 1로 좁힐 수있는 방법을보고 있습니다. app.yaml 정의를 통해 내가 metho를 정의하는 방법을 알 수 없습니다. –
그럴 수는 없지만 원래 질문에서 묻고있는 것이 아닙니다. 나는 그게 어떻게 연관되어 있는지 모르겠다. –