获取Flask应用中定义的所有路线的列表

时间:2012-11-09 23:31:24

标签: python flask

我有一个复杂的基于Flask的网络应用程序。有许多带视图功能的独立文件。他们的URL由@app.route('/...')装饰器定义。有没有办法获得在我的应用程序中声明的所有路线的列表?也许我可以在app对象上调用一些方法吗?

10 个答案:

答案 0 :(得分:119)

应用程序的所有路由都存储在app.url_map werkzeug.routing.Map的实例上。您可以使用Rule方法迭代iter_rules个实例:

from flask import Flask, url_for

app = Flask(__name__)

def has_no_empty_params(rule):
    defaults = rule.defaults if rule.defaults is not None else ()
    arguments = rule.arguments if rule.arguments is not None else ()
    return len(defaults) >= len(arguments)


@app.route("/site-map")
def site_map():
    links = []
    for rule in app.url_map.iter_rules():
        # Filter out rules we can't navigate to in a browser
        # and rules that require parameters
        if "GET" in rule.methods and has_no_empty_params(rule):
            url = url_for(rule.endpoint, **(rule.defaults or {}))
            links.append((url, rule.endpoint))
    # links is now a list of url, endpoint tuples

有关详细信息,请参阅Display links to new webpages created

答案 1 :(得分:52)

我在manage.py

上制作了一个帮助方法
@manager.command
def list_routes():
    import urllib
    output = []
    for rule in app.url_map.iter_rules():

        options = {}
        for arg in rule.arguments:
            options[arg] = "[{0}]".format(arg)

        methods = ','.join(rule.methods)
        url = url_for(rule.endpoint, **options)
        line = urllib.unquote("{:50s} {:20s} {}".format(rule.endpoint, methods, url))
        output.append(line)

    for line in sorted(output):
        print line

它通过构建一组虚拟选项来解决缺少的参数。输出如下:

CampaignView:edit              HEAD,OPTIONS,GET     /account/[account_id]/campaigns/[campaign_id]/edit
CampaignView:get               HEAD,OPTIONS,GET     /account/[account_id]/campaign/[campaign_id]
CampaignView:new               HEAD,OPTIONS,GET     /account/[account_id]/new

然后运行它:

python manage.py list_routes

有关manage.py checkout的更多信息:http://flask-script.readthedocs.org/en/latest/

答案 2 :(得分:52)

我刚遇到同样的问题。上述解决方案过于复杂。 只需在项目下打开一个新shell:

    python
    >>> from app import app
    >>> app.url_map

第一个' 应用'是我的项目脚本: app.py , 另一个是我的网站名称。

(这个解决方案适用于带有一点路线的细小网页)

答案 3 :(得分:38)

与Jonathan的回答类似,我选择这样做。我没有看到使用url_for的意义,因为如果您的参数不是字符串,它将会中断浮

@manager.command
def list_routes():
    import urllib

    output = []
    for rule in app.url_map.iter_rules():
        methods = ','.join(rule.methods)
        line = urllib.unquote("{:50s} {:20s} {}".format(rule.endpoint, methods, rule))
        output.append(line)

    for line in sorted(output):
        print(line)

答案 4 :(得分:14)

显然,从版本0.11开始,Flask has a built-in CLI。内置命令之一列出了路由:

FLASK_APP='my_project.app' flask routes

答案 5 :(得分:2)

由于您没有指定必须运行命令行,因此可以在json中为仪表板或其他非命令行界面轻松返回以下内容。无论如何,结果和输出实际上不应该从设计角度混合。这是糟糕的程序设计,即使它是一个小程序。然后,可以在Web应用程序,命令行或其他任何可以摄取json的内容中使用下面的结果。

您也没有指定您需要知道与每条路线相关联的python函数,因此这更精确地回答了您的原始问题。

我使用下面的方法将输出添加到监控仪表板中。如果你想要可用的路线方法(GET,POST,PUT等),你需要将它与上面的其他答案结合起来。

规则的 repr ()负责转换路径中的必需参数。

def list_routes():
    routes = []

    for rule in app.url_map.iter_rules():
        routes.append('%s' % rule)

    return routes

使用列表解析同样的事情:

def list_routes():
    return ['%s' % rule for rule in app.url_map.iter_rules()]

示例输出:

{
  "routes": [
    "/endpoint1", 
    "/nested/service/endpoint2", 
    "/favicon.ico", 
    "/static/<path:filename>"
  ]
}

答案 6 :(得分:2)

在您的烧瓶项目所在的目录中使用 cli 命令。

flask routes

答案 7 :(得分:1)

如果您需要自己访问视图函数,请使用app.view_functions代替UnicodeEncodeError: 'charmap' codec can't encode character '\u20b9' in position 15030: character maps to <undefined>

示例脚本:

app.url_map

运行上述脚本的输出:

from flask import Flask

app = Flask(__name__)

@app.route('/foo/bar')
def route1():
    pass

@app.route('/qux/baz')
def route2():
    pass

for name, func in app.view_functions.items():
    print(name)
    print(func)
    print()

(请注意,其中包含“静态”路线,该路线由Flask自动创建。)

答案 8 :(得分:1)

在烧瓶应用程序内部执行以下操作:

flask shell
>>> app.url_map
Map([<Rule '/' (OPTIONS, HEAD, GET) -> helloworld>,
 <Rule '/static/<filename>' (OPTIONS, HEAD, GET) -> static>])

答案 9 :(得分:0)

在导出或设置FLASK_APP环境变量后,可以通过运行以下命令来查看所有通过Flask Shell的路由。 flask shell app.url_map