我的应用程序经常将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)
如果我访问此网址,则效果很好:
http://localhost:5000/blah/cats%2F
returns:
GOT: cats/
但是%2F的前导斜线在GET的情况下失败,404在POST的情况下失败。换句话说,这是404s:
http://localhost:5000/blah/%2Fcats
在我对此问题的研究中,我始终相信here URL编码足以解决问题。然而,情况似乎并非如此。
答案 0 :(得分:1)
这是因为Werkzeug如何解析网址。它在解析路由之前解码编码的斜杠,因此它们仍然显示为前导斜杠。有关于此的错误报告:
第二个链接提供了一个补丁,用于在路由后执行此解码,但它没有合并。
此时看来最好的解决方案是遵循Martijn's answer here。
答案 1 :(得分:0)
在没有定义自己的PathConverter的情况下解决这个问题的一种方法是使用两个路由过滤器:
import flask
app = flask.Flask("Hello World")
@app.route("/blah/<path:argument>", methods=["GET"])
@app.route("/blah//<path:argument>", methods=["GET"])
def foo(argument):
return "GOT: %s" % argument
if __name__ == "__main__":
app.run(debug=True)
点击:
http://localhost:5000/blah/%2Fcats
给我:
GOT: cats
并且:
http://localhost:5000/blah//cats
给我:
GOT: cats
但是更好(更干净)的解决方案可能是本SO答案中描述的解决方案:Flask route using path with leading slash