在Flask路由中捕获任意路径

43 投票
1 回答
35890 浏览
提问于 2025-04-17 17:20

我有一个简单的Flask路由,想要获取一个文件的路径。如果我在规则中使用<path>,它可以处理/get_dir/one,但处理不了/get_dir/one/two。我该怎么做才能捕捉到任意路径,这样path='/one/two/etc就能传递给视图函数呢?

@app.route('/get_dir/<path>')
def get_dir(path):
    return path

1 个回答

88

使用 path 转换器可以捕捉任意长度的路径:<path:path> 会捕捉一个路径并把它传递给 path 这个参数。默认的转换器只会捕捉一个字符串,但在遇到斜杠时就会停止,这就是为什么你的第一个网址匹配成功而第二个没有的原因。

如果你还想匹配根目录(也就是以斜杠开头且路径为空),你可以添加另一个规则,为路径参数设置一个默认值。

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def get_dir(path):
    return path

还有其他的内置转换器,比如 intfloat,你也可以自己写转换器,以应对更复杂的情况。

撰写回答