Функция url_for
Функция url_for строит URL по имени
функции-обработчика. Это удобнее, чем
прописывать адреса вручную: при изменении
маршрута достаточно поменять правило в одном
месте. Первым параметром передаётся имя
функции в виде строки. Остальные именованные
параметры подставляются в динамические части
URL и превращаются в строку запроса.
Функцию url_for можно использовать как
в Python-коде, так и в Jinja-шаблонах. Она
импортируется из модуля flask.
Синтаксис
url_for(endpoint, **values)
Пример
Давайте построим URL для функции index:
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/')
def index():
return 'hello'
with app.test_request_context():
res = url_for('index')
print(res)
Результат выполнения кода:
"/"
Пример
Давайте построим URL для функции user,
которая принимает параметр name:
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/user/<name>')
def user(name):
return name
with app.test_request_context():
res = url_for('user', name='abcde')
print(res)
Результат выполнения кода:
"/user/abcde"
Пример
Лишние именованные параметры, которые не входят в маршрут, добавляются в строку запроса:
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/user/<name>')
def user(name):
return name
with app.test_request_context():
res = url_for('user', name='abcde', page=1)
print(res)
Результат выполнения кода:
"/user/abcde?page=1"
Пример
Давайте построим URL внутри Jinja-шаблона и сделаем ссылку:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/user/<name>')
def user(name):
return name
<a href="{{ url_for('user', name='abcde') }}">user</a>
Результат выполнения кода:
<a href="/user/abcde">user</a>
Пример
Давайте выполним перенаправление на
построенный URL с помощью функции
redirect:
from flask import Flask, url_for, redirect
app = Flask(__name__)
@app.route('/')
def index():
return redirect(url_for('user', name='abcde'))
@app.route('/user/<name>')
def user(name):
return name
Результат выполнения кода для адреса /:
abcde