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

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

112736 次浏览

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

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

有关更多信息,请参见 显示新建网页的链接

我在我的 manage.py上创建一个 helper 方法:

@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/

与乔纳森的回答类似,我选择了这样做。我不认为使用 url _ for 有什么意义,因为如果参数不是字符串,比如 float,它就会中断

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

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

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

第一个“ 应用程序”是我的项目脚本: App py, 另一个是我的网名。

(这个解决方案是针对带有小路线的微型网络)

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

您还没有指定需要知道与每个路由关联的 python 函数,因此这更准确地回答了您最初的问题。

我自己使用下面的方法将输出添加到监视仪表板。如果需要可用的路由方法(GET、 POST、 PUT 等) ,则需要将其与上面的其他答案组合起来。

规则的 公司代表()负责转换路由中所需的参数。

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>"
]
}

如果您需要访问视图函数本身,那么使用 app.view_functions代替 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()

运行以上脚本的输出:

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


route1
<function route1 at 0x128f1b9d8>


route2
<function route2 at 0x128f1ba60>

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

显然,自从0.11版 烧瓶有一个内置的 CLI以来,其中一个内置命令列出了路线:

FLASK_APP='my_project.app' flask routes

在导出或设置 FLASK _ APP 环境变量之后,你可以通过 flaskshell 运行以下命令来查看所有的路由。 烧瓶壳 App.url _ map

在你的酒瓶应用程序里做:

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

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

flask routes
print(app.url_map)

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

这是 Flask 应用程序实例的一个属性。

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