Создавайте динамические URL во Flask с помощью url_for ()


184

Половина моих маршрутов Flask требует переменной скажем /<variable>/addили /<variable>/remove. Как мне создать ссылки на эти места?

url_for() принимает один аргумент для функции для маршрутизации, но я не могу добавить аргументы?

Ответы:


283

Он принимает ключевые аргументы для переменных:

url_for('add', variable=foo)

12
имеется ввиду что функция есть def add(variable)?
эндолит

5
@endolith, да. ** Переданные kwargs url_forбудут переданы в качестве параметров функции для маршрутов переменных правил во Flask
highvolt

3
Но проблема в том, как 'foo' выходит за рамки, если это переменная из Python. Тогда как ты это решаешь?

1
Просто чтобы было понятнее, если у вас есть @app.route("/<a>/<b>")и def function(a,b): ...как его функция, то вам следует использовать url_forи указать аргументы его ключевого слова, например:url_for('function', a='somevalue', b='anothervalue')
jarrettyeo

120

url_forв Flask используется для создания URL-адреса, чтобы избежать дополнительных затрат на изменение URL-адресов во всем приложении (в том числе в шаблонах). Без этого url_for, если в корневом URL-адресе вашего приложения произошли изменения, вам придется изменять его на каждой странице, где есть ссылка.

Синтаксис: url_for('name of the function of the route','parameters (if required)')

Может использоваться как:

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

Теперь, если у вас есть ссылка на страницу индекса: вы можете использовать это:

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

С ним можно многое сделать, например:

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

Для вышесказанного мы можем использовать:

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

Таким образом, вы можете просто передать параметры!


1
У меня есть вопрос, в первом примере метод index был передан в виде строки, а во втором методе find_question передается как переменная. Зачем?
आनंद

1
@AnandTyagi Это то, что вы имеете в виду? Маршрутизация URL
Тони Чоу

3
@ आनंद если вы используете переменную, {{ url_for('find_question' ,question_id=question.id) }}а не{{ url_for('find_question' ,question_id={{question.id}}) }}
Абдур-Рахман Янхангер


1

Шаблоны:

Передать имя функции и аргумент.

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

Вид, функция

@app.route('/blog/post/<string:id>',methods=['GET'])
def get_blog_post(id):
    return id
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.