1

在老式的 webapp 中,基于 app.yaml 的路由允许您检查正则表达式,如果匹配,则由名称基于找到的模式的处理程序处理请求。例如,如果匹配的模式是“用户”,\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}. 在类中,此端点由分号和存储在andRoute中的值分隔。route.method_nameroute.handler

于 2012-01-11T22:30:45.980 回答