Toutes les routes d'une application sont stockées sur app.url_map
lesquelles se trouve une instance de werkzeug.routing.Map
. Vous pouvez parcourir les Rule
instances en utilisant la iter_rules
méthode:
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
Voir Afficher les liens vers de nouvelles pages Web créées pour un peu plus d'informations.
url = url_for(rule.endpoint)
. Je viens de recevoir cette erreurBuildError: ('DeleteEvent', {}, None)
. Au lieu de cela, pour obtenir l'url que je viens de faireurl = rule.rule
. Une idée de la raison pour laquelle votre méthode ne fonctionne pas pour moi?DeleteEvent
a un paramètre obligatoire - vous pouvez soit le cas spécial, soit filtrer toutes les règles oùlen(rule.arguments) > len(rule.defaults)
url_for
ne peut pas générer l'URL pour ce methid sans paramètre, non? OK, mais il semble que ma méthode fonctionne de toute façon, elle conserve simplement cette partie si l'URL est un paramètre. Merci!url_for(rule.endpoint)
utilisationrule.rule
qui est beaucoup mieux résoudre beacause cas où vous avez plus d'une voie pour la même méthode.Je viens de rencontrer la même question. La solution ci-dessus est trop complexe. Ouvrez simplement un nouveau shell sous votre projet:
La première « application » est le script de mon projet: app.py , une autre est le nom de mon site Web.
(cette solution est pour un petit Web avec un petit itinéraire)
la source
Map
instance ou accéder à l'une des propriétés desRule
s qu'elle contient, sans lesquelles vous ne pouvez rien faire d'utile.Je crée une méthode d'aide sur mon
manage.py
:Il résout l'argument manquant en créant un ensemble d'options factice. La sortie ressemble à:
Ensuite, pour l'exécuter:
python manage.py list_routes
Pour en savoir plus sur manage.py checkout: http://flask-script.readthedocs.org/en/latest/
la source
urllib.unquote
versurllib.parse.unquote
etprint line
versprint(line)
et cela fonctionne également en python 3.x.Semblable à la réponse de Jonathan, j'ai choisi de le faire à la place. Je ne vois pas l'intérêt d'utiliser url_for car il se cassera si vos arguments ne sont pas des chaînes, par exemple float
la source
Apparemment, depuis la version 0.11, Flask a une CLI intégrée . L'une des commandes intégrées répertorie les routes:
la source
flask urls
pour moi (0.12.1). J'ai vu çaflask --help
mais je ne vois pas les routes ou les URL sur la page CLIComme vous n'avez pas spécifié qu'il doit être exécuté en ligne de commande, ce qui suit pourrait facilement être retourné dans json pour un tableau de bord ou une autre interface non-ligne de commande. De toute façon, le résultat et la sortie ne devraient pas être mélangés du point de vue de la conception. C'est une mauvaise conception de programme, même s'il s'agit d'un tout petit programme. Le résultat ci-dessous pourrait alors être utilisé dans une application Web, une ligne de commande ou tout autre élément qui ingère json.
Vous n'avez pas non plus spécifié que vous deviez connaître la fonction python associée à chaque route, donc cela répond plus précisément à votre question initiale.
J'utilise ci-dessous pour ajouter moi-même la sortie à un tableau de bord de surveillance. Si vous voulez les méthodes d'itinéraire disponibles (GET, POST, PUT, etc.), vous devrez les combiner avec d'autres réponses ci-dessus.
La fonction repr () de Rule se charge de convertir les arguments requis dans la route.
La même chose en utilisant une compréhension de liste:
Exemple de sortie:
la source
Si vous avez besoin d'accéder aux fonctions d'affichage elles-mêmes, au lieu de
app.url_map
, utilisezapp.view_functions
.Exemple de script:
Sortie de l'exécution du script ci-dessus:
(Notez l'inclusion de la route "statique", qui est créée automatiquement par Flask.)
la source
Vous pouvez afficher toutes les routes via flask shell en exécutant les commandes suivantes après avoir exporté ou défini la variable d'environnement FLASK_APP.
flask shell app.url_map
la source
dans votre application flask, faites:
la source