Flask路由与URI编码组件

19 投票
1 回答
12628 浏览
提问于 2025-04-16 23:50

看起来Flask不支持带有URI编码的路径。我想知道我是不是做错了什么,或者是否需要添加什么特别的标志。

我的路径大概是这样的:

@app.route('/foo/<encoded>/bar/')
def foo(encoded):
  # ...
  pass

这个路径应该匹配的URL可以是这样的:

http://foobar.com/foo/xxx/bar/ # matched correctly, no URI component
http://foobar.com/foo/x%2Fx%2Fx%2F/bar/ # not matched correctly, URI component

前面的URL可以正常工作,而后面的却返回了一个漂亮的404错误。

谢谢!

1 个回答

27

在你的网址规则中添加 path

@app.route('/foo/<path:encoded>/bar/')

根据评论更新:关于路由的API文档可以在这里找到:http://flask.pocoo.org/docs/api/#flask.Flask.route。实现 path 风格路由转换器的底层类在这里:http://werkzeug.pocoo.org/docs/routing/#custom-converters(这是pocoo的一个非常不错的部分)。关于末尾斜杠,有一些特殊规则,具体如下:

如果一个规则以斜杠结尾,而用户请求时没有斜杠,用户会自动被重定向到带有斜杠的同一页面。

如果一个规则没有以斜杠结尾,而用户请求的页面带有斜杠,就会出现404未找到的错误。

另外要记住,如果你在Apache上,并且期待一个带斜杠的URL,比如一个书签提交到 http://ex.com/foo/<path:encoded>/bar,而 encoded 得到的是带有双斜杠的内容,Apache会把多个斜杠转换成一个斜杠。

撰写回答