【问题标题】:Capture arbitrary path in Flask route在 Flask 路由中捕获任意路径
【发布时间】: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

【问题讨论】:

    标签: python flask werkzeug


    【解决方案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;')。跨度>
    猜你喜欢
    • 2012-04-16
    • 2020-11-14
    • 2019-08-28
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2016-02-19
    • 2023-04-05
    相关资源
    最近更新 更多