Flask. Маршрутизация.

Продолжаем изучать фреймворк Flask, и после того, как мы научились создавать простейшее приложение (статья тут), рассмотрим тему маршрутизации. Начнем со статичных маршрутов.

Для привязки URL к функции во Flask используются маршруты (пути). Функции, которые отвечают на запрос по конкретному пути, называются функциями представления. А связывают URL с функцией с помощью декоратора route().

@app.route('/')
def index():
    return 'Hello World!'

Выше пример создания маршрута к функции index(). В данном случае декоратор route() использует абсолютный адрес со скрытым доменом и получить доступ к функции можно просто запустив наше приложение и перейдя на «localhost:5000» либо на «localhost:5000/», что равносильно, если бы мы к домену нашего приложения приписали слэш.

А теперь создадим множественные маршруты для доступа к функции. Для этого всего лишь нужно добавить новые декораторы с новыми адресами.

@app.route('/')
@app.route('/index')
@app.route('/index/')
def index():
    return 'Hello World!'

Теперь один и тот же результат мы получим, если просто перейдем по адресу хоста или добавим к нему ‘/index’ или ‘/index/’. Кстати, по умолчанию “адрес_сайта/index” и “адрес_сайта/index/” — абсолютно разные адреса, поэтому если не добавить соответствующий декоратор, достучаться до функции не получится.

Сложные маршруты ничуть не сложнее предыдущих, но помогают выделять схожие страницы в отдельную ветку. Для простоты понимания возьмем пример с марками автомобилей.

@app.route('/auto/toyota')
def toyota():
    return 'toyota'

@app.route('/auto/bmw')
def bmw():
    return 'bmw'

А вот динамические маршруты — это уже интереснее. В динамической маршрутизации используются переменные, которые передаются в декоратор с помощью скобок <>. И такие же названия указываются в качестве аргументов функции, но без скобок, соответственно.

@app.route('/auto/<brand>')
def my_love(brand):
    return f'I love {brand}!'

Мы можем использовать и несколько переменных, просто разделяя их друг от друга. Обычно это делают с помощью слэша, но можно использовать и другие знаки, например нижнее подчеркивание, двоеточие, точка с запятой. А вот с помощью «?, #» разделить переменные не получится.

@app.route('/auto/<brand>/<model>')
def my_love(brand, model):
    return f'I love {brand, model}!'

Если не указать тип переменных, как мы это и делали в предыдущих примерах, то по умолчанию они будут переданы в виде строки. Однако Flask поддерживает и другие типы переменных. Чтобы сконвертировать в нужный, необходимо указать тип переменной перед именем, разделив двоеточием:

@app.route('/auto/<string:brand>/<int:volume>')
def my_love(brand, volume):
    return f'I love {brand} volume: {volume} liters!'

Типы динамических переменных

НазваниеОписание
stringпринимает любые строки (значение по умолчанию)
intпринимает целые числа
floatпринимает числа с плавающей точкой
pathпринимает полный путь включая слэши и завершающий слэш
uuidпринимает строки uuid (символьные id)