在 Flask 路由中捕获任意路径

Posted

技术标签:

【中文标题】在 Flask 路由中捕获任意路径【英文标题】:Capture arbitrary path in Flask route 【发布时间】:2013-02-13 13:47:09 【问题描述】:

我有一个简单的 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】:

使用path 转换器捕获任意长度的路径:&lt;path:path&gt; 将捕获路径并将其传递给path 参数。默认转换器捕获单个字符串但在斜杠处停止,这就是您的第一个 url 匹配但第二个不匹配的原因。

如果您还想匹配根目录(前导斜杠和空路径),您可以add another rule 为路径参数设置默认值。

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

还有其他built-in converters,例如intfloat,对于更复杂的情况也可以write your own。

【讨论】:

对于那些 不起作用的,请确保删除 static_url_path, github.com/pallets/flask/issues/1633 我有点害怕你必须为根添加另一个规则。是不是简单理解可变部分不能是空字符串 @BobStein 我迟到了,但请注意werkzeug.routing.PathConverter 的源将匹配路径的正则表达式定义为[^/].*?。开头的[^/] 意味着它至少需要一个非斜线字符,之后可以选择出现任何其他字符(包括斜线)。我希望这种行为,如果只是因为“索引页面”是一个非常常见的概念,并且匹配 URL 中的空字符串不是我见过(或想要)的行为。 非常感谢。 “路径”正是我所需要的。 要清楚,&lt;path:path&gt; 中的第一个“路径”是转换器,第二个是传入的值。因此,如果将参数命名为 my_path,则应编写 @app.route('/&lt;path:my_path&gt;')。跨度>

以上是关于在 Flask 路由中捕获任意路径的主要内容,如果未能解决你的问题,请参考以下文章

Flask为flash创建路由,访问路径。

flask的路由

flask笔记(七):简单路由设置

Flask之三:路由

Flask源码复习之路由

未捕获的错误:[vue-router] 路由配置中需要“路径”