如何使用tornado web服务器处理同一类中的多个路由

如何使用tornado web服务器处理同一类中的多个路由,tornado,Tornado,我正在用tornado编写一个非常简单的web应用程序: class MainHandler1(tornado.web.RequestHandler): def get(self): self.render("page1.html") class MainHandler2(tornado.web.RequestHandler): def get(self): self.render("page2.html") ... application = tornado.w

我正在用tornado编写一个非常简单的web应用程序:

class MainHandler1(tornado.web.RequestHandler):
  def get(self):
     self.render("page1.html")

class MainHandler2(tornado.web.RequestHandler):
  def get(self):
     self.render("page2.html")
...

application = tornado.web.Application([(r'/route1', MainHandler1), (r'/route2', MainHandler2)], **settings)
如您所见,我有两条路由,我需要为这些路由创建两个类。 有没有一种方法可以管理同一类的多条路由


谢谢

是的,只需在路线规格中使用相同的等级:

routes = [
    (r'/route1', MainHandler1),
    (r'/route2', MainHandler1)
]
application = tornado.web.Application(routes, **settings)
编辑“如何在MainHandler1中区分route1和route2”:

我建议您不要将您的处理程序绑定到任何显式路径;相反,尝试根据路线的可变部分对其进行参数化。如果我们以您最初的示例为例,其中您有两条不同编号的路线,并基于该编号提供不同的模板,您可能会有如下情况:

class MainHandler(tornado.web.RequestHandler):
    def get(self, page_num):
        self.render("page{}.html".format(page_num))

routes = [
    (r'/route(\d+)', MainHandler),
]
application = tornado.web.Application(routes, **settings)

通过这种方式,您可以定义一条管线,但实际上可以拥有尽可能多的模板。另一方面,如果您需要对每条路线做出完全不同的响应,最好将它们保存在单独的处理程序中。

谢谢,但是我如何区分MainHandler1中的路线1和路线2?您可以参数化您的路线;我已经更新了答案,将其包括在内。另外,默认情况下,
tornado.web.RequestHandler
的子类可以通过
self.request.uri
访问完整的请求uri,也可以通过
self.request.path
访问uri路径。您的处理程序也可以始终基于这些值做出决策。这是正确的,在路线差异很大的情况下(例如,
/foo
vs
/bar
,而不是
/foo1
vs
/foo2
)是有意义的。就个人而言,我会考虑这种不同的路线(除了别名的情况下),以保证独立的处理程序;如果逻辑相似,那么一个可以是另一个的子类。