如何在 Tornado 中执行 "internal redirect"?

How to do an "internal redirect" in Tornado?

我正在将多租户 Web 应用程序移植到 Python/Tornado。假设每个租户站点都有两个页面:“/foo”和“/bar”。到目前为止,处理程序非常简单。

但是,租户可以选择在他们的主页(“/”)上显示什么内容。这可能是来自 /foo 或 /bar 的内容,但不应重定向最终用户。事实上,租户可以从他们的站点中选择任何页面并将其设为主页。

在我习惯的 PHP 框架中,这是通过内部路由逻辑完成的。但是我一辈子都想不出如何用 Tornado 完成同样的事情。

我目前正在我的 BaseHandler 的 prepare() 方法中读取每个租户的配置状态。但这显然来不及影响路由逻辑,它已经将请求映射到 Handler。

有什么方法可以将自定义路由功能附加到“/”,让我可以 select 处理程序来完成请求?

我在@xyres 的提示下弄明白了。我不相信这在任何地方都有记录。

应用程序中的规则:

url(r"/", HomeRouter(self), name="home"),

class:

from tornado.routing import Router

class HomeRouter(Router):
    def __init__(self, application):
        self.application = application

    def find_handler(self, request, **kwargs):
        ...logic here...
        home_handler = ChosenHandler
        return self.application.get_handler_delegate(request, home_handler)