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

时间:2018-10-12 10:37:29

标签: python tornado

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

2 个答案:

答案 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