如何按照匹配顺序对Flask / Werkzeug路由进行排序?

时间:2015-02-23 18:56:40

标签: flask url-routing werkzeug

我有一个功能,我用它列出我的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

1 个答案:

答案 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.buildMap.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)。