Flask路由与URI编码组件
看起来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会把多个斜杠转换成一个斜杠。