如何使用tornado web服务器处理同一类中的多个路由
我正在用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
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
)是有意义的。就个人而言,我会考虑这种不同的路线(除了别名的情况下),以保证独立的处理程序;如果逻辑相似,那么一个可以是另一个的子类。