使用带有前导斜线的路径的Flask路线

Nic*_*s L 10 python routes flask

我正在尝试使用带路径转换器的简单路径获取Flask:

@api.route('/records/<hostname>/<metric>/<path:context>') 
Run Code Online (Sandbox Code Playgroud)

它起作用,除非URL的"路径"部分使用前导斜杠.在这种情况下,我得到一个404.我理解错误,但我没有得到的是文档中没有解决方法或互联网上有关如何解决此问题的任何地方.我觉得我是第一个尝试做这个基本事情的人.

有没有办法让这个有意义的URL工作?例如这种请求:

http://localhost:5000/api/records/localhost/disks.free//dev/disk0s2 
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 14

PathConverterURL转换明确不包括前导斜杠; 因为大部分的路径应该这是故意包括这样的斜线.

查看PathConverter源代码:

regex = '[^/].*?'
Run Code Online (Sandbox Code Playgroud)

此表达式匹配任何内容,前提是它不以/.

你不能编码路径; 尝试在路径中创建不是URL分隔符的斜杠,但是通过URL编码将其中的部分值转换为%2F 大多数,如果不是所有服务器在将URL路径传递到WSGI服务器之前解码URL路径.

你必须使用不同的转换器:

from werkzeug.routing import PathConverter

class EverythingConverter(PathConverter):
    regex = '.*?'

app.url_map.converters['everything'] = EverythingConverter

@api.route('/records/<hostname>/<metric>/<everything:context>') 
Run Code Online (Sandbox Code Playgroud)

注册转换器必须在Flask app对象上完成,而不能在蓝图上完成.