Python 使用带前导斜杠的路径的路径

Python 使用带前导斜杠的路径的路径,python,flask,routes,Python,Flask,Routes,我正在尝试使用带有路径转换器的简单路径获取Flask: @api.route('/records/<hostname>/<metric>/<path:context>') import werkzeug from werkzeug.routing import PathConverter from packaging import version # whether or not merge_slashes is available and true M

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

@api.route('/records/<hostname>/<metric>/<path:context>') 
import werkzeug
from werkzeug.routing import PathConverter
from packaging import version

# whether or not merge_slashes is available and true
MERGES_SLASHES = version.parse(werkzeug.__version__) >= version.parse("1.0.0")

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

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

config = {"merge_slashes": False} if MERGES_SLASHES else {}
@api.route('/records/<hostname>/<metric>/<everything:context>', **config) 
显式不包括前导斜杠;这是故意的,因为大多数路径不应该包含这样的斜杠

见:

如果此表达式不是以
/
开头,则它与任何内容都匹配

您无法对路径进行编码;如果不是所有服务器都在将URL路径传递到WSGI服务器之前对其进行解码,那么试图通过URL编码将路径中的斜杠设置为
%2F
而不是URL分隔符,而是值的一部分,这并不会使斜杠飞得最快

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

@api.route('/records/<hostname>/<metric>/<path:context>') 
import werkzeug
from werkzeug.routing import PathConverter
from packaging import version

# whether or not merge_slashes is available and true
MERGES_SLASHES = version.parse(werkzeug.__version__) >= version.parse("1.0.0")

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

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

config = {"merge_slashes": False} if MERGES_SLASHES else {}
@api.route('/records/<hostname>/<metric>/<everything:context>', **config) 
导入werkzeug
从werkzeug.routing导入路径转换器
从打包导入版本
#合并斜杠是否可用且为true
MERGES\u SLASHES=version.parse(werkzeug.\uuuuu version\uuuuuu)>=version.parse(“1.0.0”)
类EverythingConverter(路径转换器):
正则表达式='*?'
app.url\u map.converters['everything']=EverythingConverter
config={“merge_slashes”:False}如果merge_slashes else{}
@api.route('/records//',**配置)
注意
merge\u斜杠
选项;如果已安装Werkzeug 1.0.0或更新版本,并保留默认设置,则多个连续的
/
字符将收拢为一个


注册转换器必须在Flask
app
对象上完成,而不能在blueprint上完成。

看来,即使是URL编码的path也不喜欢前导斜杠。请看这个问题:@DougT.:事实上,看起来斜杠是在url匹配发生之前解码的。这可能也依赖于服务器,但是让内置的werkzeug服务器来做这件事对于这个想法来说是非常糟糕的。我将从这个答案中删除该选项。我无法实现这一点(Flask 1.1.1、Werkzeug 1.0.0、Python 3.8.2)。无论我使用哪种转换器,Flask只路由和报告传入的URL,其中双斜杠已经折叠为单斜杠(无论URL中的位置如何)。唯一的例外似乎是
request.environ['request\u URI']
,现在,我必须直接检查它。@MortenB:对,复制并更新了答案,并对此进行了修复。