Все маршруты для приложения хранятся 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():
if "GET" in rule.methods and has_no_empty_params(rule):
url = url_for(rule.endpoint, **(rule.defaults or {}))
links.append((url, rule.endpoint))
См. Раздел Отображение ссылок на новые созданные веб-страницы для получения дополнительной информации.
url = url_for(rule.endpoint)
. Я только что получил эту ошибкуBuildError: ('DeleteEvent', {}, None)
. Вместо этого, чтобы получить URL, который я только что сделалurl = rule.rule
. Есть идеи, почему ваш метод не работает для меня?DeleteEvent
имеет обязательный параметр - вы можете либо использовать его в частном случае, либо отфильтровать любые правила, в которыхlen(rule.arguments) > len(rule.defaults)
url_for
не может сгенерировать URL для этого метида без параметра, верно? Хорошо, но похоже, что мой метод все равно работает, он просто сохраняет эту часть, если URL-адрес является параметром. Благодарность!url_for(rule.endpoint)
используйтеrule.rule
это намного лучше, потому что решайте случаи, когда у вас есть более одного маршрута для одного и того же метода.Я только что встретил тот же вопрос. Это решение слишком сложно. Просто откройте новую оболочку под своим проектом:
python >>> from app import app >>> app.url_map
Первое « приложение » - это мой скрипт проекта: 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
Он решает недостающий аргумент, создавая фиктивный набор параметров. Результат выглядит так:
Затем для его запуска:
python manage.py list_routes
Для получения дополнительной информации о проверке manage.py: http://flask-script.readthedocs.org/en/latest/
источник
urllib.unquote
наurllib.parse.unquote
иprint line
на,print(line)
и он также работает в python 3.x.Подобно ответу Джонатана, я решил сделать это вместо этого. Я не вижу смысла использовать 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)
источник
Судя по всему, начиная с версии 0.11 во Flask есть встроенный CLI . Одна из встроенных команд выводит список маршрутов:
FLASK_APP='my_project.app' flask routes
источник
flask urls
для меня (0.12.1). Видел это,flask --help
но я не вижу маршрутов или URL-адресов на странице CLIПоскольку вы не указали, что он должен запускаться из командной строки, следующее можно легко вернуть в json для панели мониторинга или другого интерфейса, отличного от командной строки. В любом случае результат и результат не должны смешиваться с точки зрения дизайна. Это плохой дизайн программы, даже если это крошечная программа. Приведенный ниже результат можно затем использовать в веб-приложении, командной строке или в любом другом месте, которое принимает 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>" ] }
источник
Если вам необходимо получить доступ к самим функциям зрения, то вместо
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, выполнив следующие команды после экспорта или установки переменной среды FLASK_APP.
flask shell app.url_map
источник
внутри вашего фляжного приложения выполните:
flask shell >>> app.url_map Map([<Rule '/' (OPTIONS, HEAD, GET) -> helloworld>, <Rule '/static/<filename>' (OPTIONS, HEAD, GET) -> static>])
источник