我正在从Bottle转到Tornado。在Bottle上,我可以轻松定义具有多个可变部分的路径。像这样:
@app.get('/api/applications/<resource>/running_actions/<action_id>')
def get_application_running_action(resource, action_id):
# Return running action(<action_id>) of the application (<resource>)
在龙卷风上,我想要这样的东西:
app = tornado.web.Application([
(r"/api", ApiRootHandler),
(r"/api/applications/(.*)", ApiApplicationHandler),
(r"/api/applications/(.*)/running_actions/(.*)", ApiRunningActionsHandler),
])
然后,ApiRunningActionsHandler将搜索该应用程序并为该应用程序运行操作。但是在ApiRunningActionsHandler Get()上只有一个路径参数。有什么办法可以在Tornado上做到这一点,还是我只需要在ApiRunningActionsHandler上再次解析路径?实际上甚至是不可能的,因为我想将对/api/applications/(.*)的请求定向到另一个处理程序。
答案 0 :(得分:1)
我知道了。主要问题是我的正则表达式正在捕获所有内容。所以
r"/api/applications/(.*)/running_actions/(.*)"
实际上只产生一组。因此未设置action_id参数。
第二个问题是必须首先定义大多数描述性路径。
这有效:
class ApiRootHandler(tornado.web.RequestHandler):
def get(self):
pass
class ApiApplicationHandler(tornado.web.RequestHandler):
def get(self, action_name):
pass
class ApiRunningActionsHandler(tornado.web.RequestHandler):
def get(self, action_name, action_id):
self.write("action_name: " + action_name + ", action_id: " + action_id)
app = tornado.web.Application([
(r"/api/applications/(\w+)/running_actions/([0-9]+)", ApiRunningActionsHandler),
(r"/api/(\w+)", ApiApplicationHandler),
(r"/api/", ApiRootHandler),
])
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
答案 1 :(得分:0)
只需将ApiApplicationHandler.get的第二个参数设为可选:
-i