Tornado web应用程序路径上的多个变量(regex组)

2024-09-28 22:22:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我要从瓶子换成龙卷风。在瓶子上,我可以很容易地定义有多个可变部分的路径。像这样:

@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()上只有一个path参数。在Tornado上有什么方法可以做到这一点,还是我只需要在ApiRunningActionsHandler上再次解析路径?这实际上甚至不可能,因为我想将对/api/applications/(*)的请求定向到另一个处理程序。你知道吗


Tags: 路径actionsapiidapp瓶子get定义
2条回答

把第二个论点说成piApplicationHandler.get获取可选:

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

我想出来了。主要问题是我的正则表达式捕捉到了一切。所以呢

r"/api/applications/(.*)/running_actions/(.*)" 

实际上只有一组。因此没有设置action\u 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()

相关问题 更多 >