Todas as rotas para um aplicativo são armazenadas nas app.url_map
quais é uma instância werkzeug.routing.Map
. Você pode iterar sobre as Rule
instâncias usando o iter_rules
método:
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 Exibir links para novas páginas da web criadas para um pouco mais de informação.
url = url_for(rule.endpoint)
. Acabei de receber este erroBuildError: ('DeleteEvent', {}, None)
. Em vez disso, para obter o URL que acabei de receberurl = rule.rule
. Alguma idéia de por que seu método não funciona para mim?DeleteEvent
tem um exigido parâmetro - você pode especial caso que um ou filtrar qualquer regras ondelen(rule.arguments) > len(rule.defaults)
url_for
não pode gerar o URL para esse metid sem um parâmetro, certo? OK, mas parece que meu método funciona de qualquer maneira, apenas mantém essa parte se a URL como parâmetro. Obrigado!url_for(rule.endpoint)
userule.rule
muito melhor porque resolverá casos em que você tenha mais de uma rota para o mesmo método.Acabei de encontrar a mesma pergunta. A solução acima é muito complexa. Basta abrir um novo shell no seu projeto:
O primeiro ' app ' é o script do meu projeto: app.py , outro é o nome da minha web.
(esta solução é para web pequena com uma pequena rota)
fonte
Map
instância ou acessar qualquer uma das propriedades dosRule
s que ela contém, sem as quais você não pode realmente fazer nada útil.Eu faço um método auxiliar no meu
manage.py
:Ele resolve o argumento que falta, criando um conjunto fictício de opções. A saída se parece com:
Então, para executá-lo:
python manage.py list_routes
Para mais informações sobre o checkout manage.py: http://flask-script.readthedocs.org/en/latest/
fonte
urllib.unquote
paraurllib.parse.unquote
eprint line
paraprint(line)
e também funciona no python 3.x.Semelhante à resposta de Jonathan, optei por fazer isso. Eu não vejo o ponto de usar url_for, pois ele será interrompido se seus argumentos não forem string, por exemplo, float
fonte
Aparentemente, desde a versão 0.11, o Flask possui uma CLI integrada . Um dos comandos internos lista as rotas:
fonte
flask urls
para mim (0.12.1). Viu que noflask --help
, mas não vejo rotas ou urls na página CLIComo você não especificou que ele deve ser executado na linha de comandos, o seguinte poderia ser facilmente retornado em json para um painel ou outra interface que não seja da linha de comandos. O resultado e a saída realmente não devem ser misturados da perspectiva do design. É um design de programa ruim, mesmo que seja um programa minúsculo. O resultado abaixo pode ser usado em um aplicativo Web, linha de comando ou qualquer outra coisa que ingira json.
Você também não especificou que precisava conhecer a função python associada a cada rota, portanto, isso responde com mais precisão à sua pergunta original.
Eu uso abaixo para adicionar a saída a um painel de monitoramento. Se você quiser os métodos de rota disponíveis (GET, POST, PUT etc.), será necessário combiná-lo com outras respostas acima.
O repr () da regra cuida da conversão dos argumentos necessários na rota.
A mesma coisa usando uma compreensão de lista:
Saída de amostra:
fonte
Se você precisar acessar as funções de exibição, então, em vez de
app.url_map
, useapp.view_functions
.Script de exemplo:
Saída da execução do script acima:
(Observe a inclusão da rota "estática", criada automaticamente pelo Flask.)
fonte
Você pode visualizar todas as rotas através do shell do balão executando os seguintes comandos após exportar ou definir a variável de ambiente FLASK_APP.
flask shell app.url_map
fonte
dentro do seu aplicativo de balão, faça:
fonte