Capture arbitrary path in Flask route
我有一个简单的Flask路由,我想捕获文件的路径。 如果在规则中使用,则它适用于/get_dir/one,但不适用于/get_dir/one/two。 如何捕获任意路径,以便将path='/one/two/etc传递给视图函数?
1 2 3
| @app.route('/get_dir/<path>')
def get_dir(path):
return path |
使用path转换器捕获任意长度的路径:将捕获路径并将其传递给path参数。 默认转换器捕获单个字符串,但以斜杠停止,这就是为什么第一个URL匹配但第二个URL不匹配的原因。
如果您还想匹配根目录(斜杠和空路径),则可以添加另一个规则,该规则为path参数设置默认值。
1 2 3 4
| @app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def get_dir(path):
return path |
还有其他内置转换器,例如int和float,对于更复杂的情况,也可以编写自己的转换器。
-
感谢您的出色回答和支持文档!
-
对于无法正常运行的那些,请确保删除static_url_path,github.com/pallets/flask/issues/1633
-
我有点惊慌,您必须为根添加另一个规则。 是否简单理解可变部分不能为空字符串?
-
@BobStein我来晚了,但是请注意,werkzeug.routing.PathConverter的源代码将用于匹配路径的正则表达式定义为[^].*?。 开头的[^]表示它至少需要一个非斜杠字符,此后还可以选择包含其他任何字符(包括斜杠)。 如果只是因为索引页是一个非常普遍的概念并且匹配URL中的空字符串,那我肯定会期望这种行为,这不是我见过(或想要)的行为。