【发布时间】:2015-04-25 05:13:28
【问题描述】:
我有一个函数用于列出我的 Flask 站点的路由,并希望确保它按照 Flask/Werkzeug 匹配的顺序对它们进行排序。
目前我有
def routes(verbose, wide, nostatic):
"""List routes supported by the application"""
for rule in sorted(app.url_map.iter_rules()):
if nostatic and rule.endpoint == 'static':
continue
if verbose:
fmt = "{:45s} {:30s} {:30s}" if wide else "{:35s} {:25s} {:25s}"
line = fmt.format(rule, rule.endpoint, ','.join(rule.methods))
else:
fmt = "{:45s}" if wide else "{:35s}"
line = fmt.format(rule)
print(line)
但这似乎只是按照我在代码中定义的顺序对路由进行排序。
如何按匹配顺序对 Flask/Werkzeug 路由进行排序?
另一种方法:指定主机和路径并查看适用的规则。
urls = app.url_map.bind(host)
try:
m = urls.match(match, "GET")
z = '{}({})'.format(m[0], ','.join(["{}='{}'".format(arg, m[1][arg]) for arg in m[1]] +
["host='{}'".format(host)]))
return z
except NotFound:
return
【问题讨论】:
-
它们按此顺序显示,因为它们是这样存储的。请参阅github.com/mitsuhiko/werkzeug/blob/master/werkzeug/… 和其中的github.com/mitsuhiko/werkzeug/blob/master/werkzeug/… 了解内部工作原理:)
-
@JoeDoherty:
sorted(app.url_map.iter_rules())也是按匹配顺序排列它们吗? -
for rule in self.map._rules:我认为它们没有排序。我能问一下你需要什么确切的订单吗? -
@JoeDoherty:对于上面的函数。确保按照我想要的顺序检查它们。那么:如何按照匹配的顺序获取它们?
-
去掉
sorted()应该是正确的。没有理由对其进行排序。
标签: flask url-routing werkzeug