我有一个功能,我用它列出我的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
答案 0 :(得分:2)
在每个请求中,如果需要路线权重,Flask / Werkzeug会重新排序self.map.update()
规则(请参阅我的另一个答案URL routing conflicts for static files in Flask dev server)。
您可以找到Map.update
方法更新_rules
(请参阅https://github.com/mitsuhiko/werkzeug/blob/master/werkzeug/routing.py#L1313)。
所以你可以做同样的事情:
sorted(current_app.url_map._rules, key=lambda x: x.match_compare_key())
或者,如果已加载所有路线并且已完成任何请求(称为Map.build
或Map.match
),则只使用app.url_map._rules
- 它将被排序。在已排序的请求app.url_map._rules
中,因为在调度程序之前调用了Map.match
(与调度程序匹配规则)。
您还可以在Map.update
中找到Map.iter_rules
,因此您可以使用此方法current_app.url_map.iter_rules()
(请参阅https://github.com/mitsuhiko/werkzeug/blob/master/werkzeug/routing.py#L1161)。