Answers:
应用程序的所有路由都存储在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
有关更多信息,请参见显示指向创建的新网页的链接。
DeleteEvent
具有必需的参数-您可以对此进行特殊说明,也可以在其中过滤掉任何规则len(rule.arguments) > len(rule.defaults)
url_for
没有参数就无法为该方法生成URL,对吗?可以,但是无论如何我的方法似乎都能正常工作,如果将URL作为参数,它将保留该部分。谢谢!
url_for(rule.endpoint)
使用rule.rule
,因为这可以解决同一方法具有多个路径的情况。
我刚刚遇到了同样的问题。上面的解决方案太复杂了。只需在您的项目下打开一个新的shell:
python
>>> from app import app
>>> app.url_map
第一个“ app ”是我的项目脚本:app.py,另一个是我的网站名称。
(此解决方案适用于路由很少的小型网络)
Map
实例或访问实例所Rule
包含的任何属性,否则,您将无法做任何有用的事情。
我在我的帮助方法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/
urllib.unquote
为urllib.parse.unquote
and print line
即可print(line)
,它也适用于python3.x。
与乔纳森(Jonathan)的回答类似,我选择这样做。我看不到使用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)
由于您没有指定必须在命令行运行,因此可以在json中为仪表板或其他非命令行界面轻松返回以下内容。无论如何,从设计的角度来看,结果和输出确实不应该混在一起。即使是很小的程序,它也是不好的程序设计。然后,可以在Web应用程序,命令行或其他任何提取json的内容中使用以下结果。
您也没有指定您需要了解与每个路由关联的python函数,因此这可以更准确地回答您的原始问题。
我在下面使用自己将输出添加到监视仪表板。如果您想要可用的路由方法(GET,POST,PUT等),则需要将其与上述其他答案结合使用。
Rule的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>"
]
}
如果您需要自己访问视图函数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自动创建。)
在烧瓶应用程序中执行以下操作:
flask shell
>>> app.url_map
Map([<Rule '/' (OPTIONS, HEAD, GET) -> helloworld>,
<Rule '/static/<filename>' (OPTIONS, HEAD, GET) -> static>])
url = url_for(rule.endpoint)
。我刚遇到这个错误BuildError: ('DeleteEvent', {}, None)
。取而代之的是获取URLurl = rule.rule
。知道为什么您的方法对我不起作用吗?