Tornado Web 应用程序路径上的多个变量(正则表达式组)

Multiple variables (regex groups) on Tornado web application path

我正在从 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/(.*) 的请求定向到另一个处理程序。

只需将 ApiApplicationHandler.get 的第二个参数设为可选:

class ApiApplicationHandler(RequestHandler):
    def get(self, resource, action_id=None):
        pass

我明白了。主要问题是我的正则表达式捕获了所有内容。所以

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()