Obtenga una lista de todas las rutas definidas en la aplicación Flask

Tengo una aplicación web compleja basada en matraz. Hay muchos archivos separados con funciones de visualización. Sus URL se definen con el @app.route('/...') . ¿Hay alguna forma de obtener una lista de todas las rutas que se han declarado en mi aplicación? Tal vez hay algún método que puedo llamar en el objeto de la app ?

Todas las rutas para una aplicación se almacenan en app.url_map que es una instancia de werkzeug.routing.Map . Puede iterar sobre las instancias de la Rule usando el método 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 

Consulte Mostrar enlaces a nuevas páginas web creadas para obtener un poco más de información.

Hago un método de ayuda en mi 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 

Resuelve el argumento faltante construyendo un conjunto de opciones ficticias. La salida se ve como:

 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 

Entonces para ejecutarlo:

python manage.py list_routes

Para más información sobre la verificación de manage.py: http://flask-script.readthedocs.org/en/latest/

Acabo de encontrar la misma pregunta. Esas soluciones anteriores son demasiado complejas. Solo abre un nuevo shell en tu proyecto:

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

La primera ‘ aplicación ‘ es mi script de proyecto: app.py , otro es el nombre de mi web.

(Esta solución es para websito con una pequeña ruta).

Similar a la respuesta de Jonathan, opté por hacer esto en su lugar. No veo el punto de usar url_for ya que se romperá si sus argumentos no son una cadena, por ejemplo, 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) 

Aparentemente, desde la versión 0.11, Flask tiene un CLI incorporado . Uno de los comandos incorporados enumera las rutas:

 FLASK_APP='my_project.app' flask routes 

Como no especificó que debe ejecutarse en la línea de comandos, lo siguiente podría devolverse fácilmente en json para un panel de control u otra interfaz que no sea de línea de comandos. De todos modos, el resultado y la salida no deberían mezclarse desde la perspectiva del diseño. Es un mal diseño del progtwig, incluso si es un progtwig pequeño. El resultado a continuación podría usarse en una aplicación web, línea de comandos o cualquier otra cosa que ingiera json.

Tampoco especificaste que necesitabas conocer la función de python asociada con cada ruta, así que esto responde de manera más precisa a tu pregunta original.

Utilizo a continuación para agregar la salida a un panel de monitoreo. Si desea los métodos de ruta disponibles (GET, POST, PUT, etc.), deberá combinarlo con otras respuestas anteriores.

Rule’s repr () se encarga de convertir los argumentos requeridos en la ruta.

 def list_routes(): routes = [] for rule in app.url_map.iter_rules(): routes.append('%s' % rule) return routes 

Lo mismo usando una lista de comprensión:

 def list_routes(): return ['%s' % rule for rule in app.url_map.iter_rules()] 

Salida de muestra:

 { "routes": [ "/endpoint1", "/nested/service/endpoint2", "/favicon.ico", "/static/" ] } 

Si necesita acceder a las funciones de visualización, entonces, en lugar de app.url_map , use app.view_functions .

Ejemplo de script:

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

Salida de ejecutar el script anterior:

 static > route1  route2  

(Tenga en cuenta la inclusión de la ruta “estática”, que Flask crea automáticamente.)