Crie URLs dinâmicos no Flask com url_for ()


183

Metade das minhas rotas do Flask requer uma variável digamos, /<variable>/addou /<variable>/remove. Como crio links para esses locais?

url_for() leva um argumento para a função rotear, mas não consigo adicionar argumentos?

Respostas:


282

Leva argumentos de palavras-chave para as variáveis:

url_for('add', variable=foo)

12
significando que a função é def add(variable)?
endolith 31/07

5
@ endolith, Sim. ** kwargs passado para url_forse passar como parâmetros de função para rotas de regras variáveis em Flask
HIGHVOLT

3
Mas o problema é como 'foo' está além do escopo se for uma variável do Python. Então, como você resolve isso?

1
Apenas para que fique mais claro, se você tiver @app.route("/<a>/<b>")e def function(a,b): ...como função, deverá usar url_fore especificar os argumentos das palavras-chave como este:url_for('function', a='somevalue', b='anothervalue')
jarrettyeo

120

url_forno Flask é usado para criar uma URL para evitar que as despesas gerais alterem as URLs em um aplicativo (inclusive nos modelos). Sem isso url_for, se houver uma alteração no URL raiz do seu aplicativo, você deverá alterá-lo em todas as páginas em que o link estiver presente.

Sintaxe: url_for('name of the function of the route','parameters (if required)')

Pode ser usado como:

@app.route('/index')
@app.route('/')
def index():
    return 'you are in the index page'

Agora, se você tiver um link, a página de índice: você pode usar isto:

<a href={{ url_for('index') }}>Index</a>

Você pode fazer muitas coisas com ele, por exemplo:

@app.route('/questions/<int:question_id>'):    #int has been used as a filter that only integer will be passed in the url otherwise it will give a 404 error
def find_question(question_id):  
    return ('you asked for question{0}'.format(question_id))

Para o acima exposto, podemos usar:

<a href = {{ url_for('find_question' ,question_id=1) }}>Question 1</a>

Assim você pode simplesmente passar os parâmetros!


1
Eu tenho uma pergunta, no primeiro exemplo, o método index foi passado como uma string, enquanto no segundo método, o find_question está sendo passado como variável. Por quê?
आनंद

1
@AnandTyagi É isso que você quer dizer? Roteamento de URL
Tony Chou

3
@ आनंद se você faz variável: {{ url_for('find_question' ,question_id=question.id) }}e não{{ url_for('find_question' ,question_id={{question.id}}) }}
Abdur-Rahmaan Janhangeer


1

Modelos:

Passe o nome e o argumento da função.

<a href="{{ url_for('get_blog_post',id = blog.id)}}">{{blog.title}}</a>

Ver, função

@app.route('/blog/post/<string:id>',methods=['GET'])
def get_blog_post(id):
    return id
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.