如何在 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)
我正在将多租户 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)