在老式的 webapp 中,基于 app.yaml 的路由允许您检查正则表达式,如果匹配,则由名称基于找到的模式的处理程序处理请求。例如,如果匹配的模式是“用户”,\1_handler.py 将分派给 user_handler.py。
有没有办法用 webapp2.Route 做同样的事情?惰性处理程序或 method_handler 参数可以基于模板中的匹配模式吗?
在老式的 webapp 中,基于 app.yaml 的路由允许您检查正则表达式,如果匹配,则由名称基于找到的模式的处理程序处理请求。例如,如果匹配的模式是“用户”,\1_handler.py 将分派给 user_handler.py。
有没有办法用 webapp2.Route 做同样的事情?惰性处理程序或 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}
. 在类中,此端点由分号和存储在andRoute
中的值分隔。route.method_name
route.handler