获取应用程序中定义的所有路线的列表
我有一个复杂的基于Flask的Web应用程序。 有很多单独的文件与查看function。 他们的URL是用@app.route('/...')
装饰器定义的。 有没有一种方法可以获取我的应用程序中已经声明的所有路线的列表? 也许有一些方法可以调用app
对象?
应用程序的所有路由都存储在werkzeug.routing.Map
一个实例app.url_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
请参阅显示创build新网页的链接了解更多信息。
我在我的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
它通过build立一套虚拟选项来解决缺失的问题。 输出如下所示:
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/
与乔纳森的回答类似,我select这样做。 我没有看到使用url_for,因为它会打破如果你的参数不是string,例如浮法
@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)
我刚刚遇到了同样的问题。 以上解决scheme太复杂。 只需在您的项目下打开一个新的shell:
python >>> from app import app >>> app.url_map
第一个“ 应用程序 ”是我的项目脚本: app.py ,另一个是我的networking名称。
(这个解决scheme适用于一些简单的路线)