Python Flask——URL 编码的前导斜杠导致 404 或 405

Dou*_* T. 6 python flask

我的应用程序经常将 URL 编码的字符串作为 URL 参数。通常这些字符串看起来像带有前导斜杠的路径。IE /file/foo。在 Flask 中,我有一个端点,它接受一个路径参数,我将 URL 编码的路径发送到该路径参数。所以我有一些看起来像这样的东西:

import flask
app = flask.Flask("Hello World")

@app.route("/blah/<path:argument>", methods=["GET"])
def foo(argument):
    return "GOT: %s" % argument

if __name__ == "__main__":
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

如果我访问以下 URL,这会非常有效:

http://localhost:5000/blah/cats%2F

returns:

GOT: cats/
Run Code Online (Sandbox Code Playgroud)

但是以 %2F 开头的斜杠会失败,在 GET 情况下会出现 404 错误,在 POST 情况下会出现 405 错误。换句话说,这个 404:

http://localhost:5000/blah/%2Fcats
Run Code Online (Sandbox Code Playgroud)

在我对这个问题的研究中,我被引导相信URL编码足以解决这个问题。但事实似乎并非如此。

dav*_*ism 3

这是因为 Werkzeug 解析 url 的方式。它在解析路由之前对编码的斜杠进行解码,因此它们仍然显示为前导斜杠。有关于此的错误报告:

第二个链接提供了一个补丁来在路由后执行此解码,但它没有合并。

看来目前最好的解决方案是遵循Martijn 的回答here