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

如何按照匹配的顺序对Flask/Werkzeug路线进行排序?,flask,url-routing,werkzeug,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 == 's

我有一个功能,我正在使用它为我的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

在每个请求中,Flask/Werkzeug重新排序
self.map.update()
规则,如果需要,使用路由权重(参见我的另一个答案)

您可以找到
Map.update
方法更新
\u规则(请参阅)

所以你可以做同样的事情:

sorted(current_app.url_map._rules, key=lambda x: x.match_compare_key())
或者,如果已经加载了所有路由并且完成了任何请求(称为
Map.build
Map.match
),只需使用
app.url\u Map.\u rules
,它将被排序。在请求
app.url\u map.\u rules
中已排序,因为
map.match
是在调度程序之前调用的(将规则与调度程序匹配)


您还可以找到在
Map.iter\u rules
中调用的
Map.update
,因此您可以使用此方法
current\u app.url\u Map.iter\u rules()
(请参阅)。

它们按该顺序显示,因为这就是它们的存储方式。查看和查看内部工作:)@JoeDoherty:So is
排序(app.url\u map.iter\u rules())
将它们按匹配顺序排列?
查看self.map中的规则。\u rules:
我认为它们没有排序。我能问一下您需要确切的订单吗?@JoeDoherty:上面的功能。确保他们按照我想要的顺序被检查。那么:如何按照匹配的顺序获取它们呢?去掉
sorted()
,这应该是正确的。没有理由对它进行排序。所以
排序(…x.match\u compare\u key())
当前的应用程序.url\u map.iter\u rules()
将给出相同的结果(它们对我来说是一样的),并且该结果将被“排序”,对吗?让我困惑的是,如果这是真的,以
静态
开头的路径的行为非常奇怪。在我的开发机器和服务器上,(列出的)第一位代码最后列出了静态规则,这也是第二位代码的工作方式(将
静态
与非静态规则匹配)。这是一致的。我的开发机器上的实际应用程序行为也是如此:我的规则而不是静态规则匹配静态路径。但是在服务器上(尽管我的问题中的两段代码都将静态放在最后),静态规则捕获任何静态路径!我的答案中的所有例子都应该给出相同的结果。我不完全理解您的第二条评论,但您应该理解,
静态
路由与另一条相同-它具有从某个目录返回文件的规则和调度程序(端点)。在您的prod服务器上,根据配置,nginx、apache或其他web服务器可以截取静态路径。因此,可能发生的情况是,服务器甚至有机会处理它们?也许,我不知道,但AWS比开发人员更聪明并截取此规则(不是静态的,不是资产或其他东西)看起来非常奇怪。您可以将应用程序的
static\u url\u path
更改为unexpective,并检查其是否仍然正确(当您使用
url\u for
生成静态url时,它将正常工作)。