質問
Old School WebAppでは、app.yamlベースのルーティングを使用すると、正規表現を確認でき、一致する場合は、発見されたパターンに基づいた名前のハンドラーによるリクエストを処理します。たとえば、 1_handler.pyは、一致したパターンが「ユーザー」だった場合、user_handler.pyに派遣します。
WebApp2.routeで同じことをする方法はありますか?怠zyなハンドラーまたはmethod_handlerパラメーターは、テンプレートの一致したパターンに基づいていますか?
解決
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}'),
])
この例では、メソッド名のパターンから変数を使用することはできません。たとえば、次のようです。 module.Class:action_{method}
. 。の Route
クラスこのエンドポイントはセミコロンによって分割され、値が保存されます route.method_name
と route.handler
.
所属していません StackOverflow