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

2025-04-15 09:20:00
admin
原创
54
摘要:问题描述:我有一个基于 Flask 的复杂 Web 应用。其中有很多包含视图函数的独立文件。它们的 URL 是用@app.route('/...')装饰器定义的。有没有办法获取应用中所有已声明路由的列表?或者有什么方法可以调用该app对象?解决方案 1:应用程序的所有路由都存储在app.url_map的一个实...

问题描述:

我有一个基于 Flask 的复杂 Web 应用。其中有很多包含视图函数的独立文件。它们的 URL 是用@app.route('/...')装饰器定义的。有没有办法获取应用中所有已声明路由的列表?或者有什么方法可以调用该app对象?


解决方案 1:

应用程序的所有路由都存储在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

请参阅显示新创建的网页的链接以获取更多信息。

解决方案 2:

我刚刚也遇到了同样的问题。上面的解决方案太复杂了。只需在你的项目下打开一个新的 shell 即可:

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

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

(此解决方案适用于具有少量路由的微型网络)

解决方案 3:

显然,从 0.11 版本开始,Flask 就内置了 CLI。其中一个内置命令列出了路由:

FLASK_APP='my_project.app' flask routes

解决方案 4:

我在我的上创建了一个辅助方法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 的更多信息,请查看:http://flask-script.readthedocs.org/en/latest/

解决方案 5:

与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)

解决方案 6:

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

flask routes

解决方案 7:

由于您没有指定必须通过命令行运行,因此以下内容可以很容易地以 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>"
  ]
}

解决方案 8:

如果您需要访问视图函数本身,那么请app.url_map使用而不是app.view_functions

示例脚本:

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()

运行上述脚本的输出:

static
<bound method _PackageBoundObject.send_static_file of <Flask '__main__'>>

route1
<function route1 at 0x128f1b9d8>

route2
<function route2 at 0x128f1ba60>

(请注意包含“静态”路由,它是由 Flask 自动创建的。)

解决方案 9:

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

解决方案 10:

在你的 Flask 应用程序中执行以下操作:

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

解决方案 11:

print(app.url_map)

也就是说,如果你的 Flask 应用程序名称是“app”。

它是 Flask App 实例的一个属性。

请参阅https://flask.palletsprojects.com/en/2.1.x/api/#flask.Flask.url_map

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3949  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2735  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   74  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   82  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   68  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用