1

古い学校のウェブアプリでは、app.yamlベースのルーティングにより、正規表現をチェックし、一致した場合は、見つかったパターンに基づいた名前のハンドラーによってリクエストを処理できました。たとえば、一致したパターンが'user'の場合、\1_handler.pyはuser_handler.pyにディスパッチします。

webapp2.Routeで同じことをする方法はありますか?レイジーハンドラーまたはmethod_handlerパラメーターは、テンプレート内の一致したパターンに基づくことができますか?

4

1 に答える 1

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}'),
 ])

この例では、メソッド名のパターンの変数を使用できません。例:module.Class:action_{method}。クラスではRoute、このエンドポイントはセミコロンで分割され、値はとに格納されroute.method_nameますroute.handler

于 2012-01-11T22:30:45.980 に答える