Маршрутизация в Flask: @app.route()

Маршрутизация в Flask: @app.route() Flask

Привет! В Flask маршрутизация — это процесс связывания URL-адресов с функциями-представлениями (views). За это отвечает декоратор @app.route().

В этой статье мы разберём:

  • Что такое маршрутизация
  • Синтаксис @app.route()
  • Динамические маршруты
  • Конвертеры типов
  • Методы HTTP в маршрутах

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный Flask
  • Базовое понимание функций

Совет: @app.route() — это декоратор, который связывает URL с функцией.

Основная часть

Что такое маршрутизация

Маршрутизация — это процесс, который определяет, какая функция будет вызвана при обращении к определённому URL.

@app.route('/')
def index():
    return 'Главная страница'

@app.route('/about')
def about():
    return 'Страница о нас'

Совет: Flask использует декораторы для привязки маршрутов. Это делает код чистым и понятным.

Синтаксис @app.route()

@app.route(rule, methods=['GET'], endpoint=None)
def view_function():
    return response

Параметры:

ПараметрНазначение
ruleURL-маршрут (обязательный)
methodsСписок HTTP-методов (по умолчанию ['GET'])
endpointИмя конечной точки (опционально)

Пример:

@app.route('/')
def index():
    return '<h1>Главная страница</h1>'

Статические маршруты

Статические маршруты — это фиксированные URL:

@app.route('/')
def index():
    return 'Главная'

@app.route('/about')
def about():
    return 'О нас'

@app.route('/contact')
def contact():
    return 'Контакты'

Совет: Статические маршруты подходят для страниц, которые не меняются.

Динамические маршруты

Динамические маршруты позволяют передавать параметры в URL:

@app.route('/user/<username>')
def profile(username):
    return f'Профиль пользователя: {username}'

# /user/anna → Профиль пользователя: anna
# /user/ivan → Профиль пользователя: ivan

Совет: Имя переменной в <> должно совпадать с именем параметра в функции.

Конвертеры типов

Конвертеры позволяют указать тип данных для переменной:

КонвертерТипПример
stringСтрока (по умолчанию)/<string:name>
intЦелое число/<int:post_id>
floatДробное число/<float:price>
pathПуть с слешами/<path:path>
uuidUUID/<uuid:uuid>

Примеры:

@app.route('/post/<int:post_id>')
def post_detail(post_id):
    return f'Пост #{post_id}'

@app.route('/product/<float:price>')
def product(price):
    return f'Цена: {price}$'

@app.route('/files/<path:file_path>')
def download(file_path):
    return f'Файл: {file_path}'

Совет: Конвертеры автоматически проверяют тип данных. Если тип не совпадает, Flask вернёт ошибку 404.

Несколько параметров в URL

Можно передавать несколько параметров:

@app.route('/post/<int:year>/<int:month>/<int:day>')
def date_page(year, month, day):
    return f'Дата: {year}-{month:02d}-{day:02d}'

# /post/2026/12/31 → Дата: 2026-12-31

Методы HTTP в маршрутах

По умолчанию Flask обрабатывает только GET. Для других методов нужно указать methods:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return 'Вы вошли'
    return 'Форма входа'

@app.route('/api/users', methods=['GET', 'POST', 'PUT', 'DELETE'])
def api_users():
    if request.method == 'GET':
        return 'Список пользователей'
    elif request.method == 'POST':
        return 'Создание пользователя'
    elif request.method == 'PUT':
        return 'Обновление пользователя'
    elif request.method == 'DELETE':
        return 'Удаление пользователя'

Совет: Всегда указывай methods, если маршрут должен принимать не только GET.

Именованные маршруты (endpoint)

Каждый маршрут имеет имя — endpoint. По умолчанию это имя функции.

@app.route('/')
def index():
    # endpoint = 'index'
    return 'Главная'

@app.route('/about', endpoint='about_page')
def about():
    # endpoint = 'about_page'
    return 'О нас'

Использование:

from flask import url_for

url = url_for('index')        # '/'
url = url_for('about_page')   # '/about'

Совет: url_for() генерирует URL по имени маршрута. Это удобно при изменении маршрутов.

Полный пример

app.py:

from flask import Flask, request, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return '''
        <h1>Главная</h1>
        <a href="/about">О нас</a>
        <a href="/user/anna">Анна</a>
        <a href="/post/42">Пост #42</a>
    '''

@app.route('/about')
def about():
    return '<h1>О нас</h1><a href="/">На главную</a>'

@app.route('/user/<username>')
def user_profile(username):
    return f'<h1>Профиль: {username}</h1><a href="/">На главную</a>'

@app.route('/post/<int:post_id>')
def post_detail(post_id):
    return f'<h1>Пост #{post_id}</h1><a href="/">На главную</a>'

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return 'Вы вошли!'
    return '''
        <form method="post">
            <input type="text" name="username" placeholder="Имя">
            <input type="password" name="password" placeholder="Пароль">
            <button type="submit">Войти</button>
        </form>
    '''

if __name__ == '__main__':
    app.run(debug=True)

Задачи для закрепления

Задача 1. Создай маршрут для страницы товара с параметром id (int).

Задача 2. Создай маршрут для страницы блога с параметром slug (string).

Задача 3. Создай маршрут для профиля пользователя с параметрами username и age.

Задача 4. Добавь маршрут, который принимает метод POST.

Задача 5. Создай маршрут с конвертером path.

Ответы:

Задача 1.

@app.route('/product/<int:product_id>')
def product(product_id):
    return f'Товар #{product_id}'

Задача 2.

@app.route('/blog/<string:slug>')
def blog_post(slug):
    return f'Пост: {slug}'

Задача 3.

@app.route('/user/<username>/<int:age>')
def user_profile(username, age):
    return f'Пользователь: {username}, Возраст: {age}'

Задача 4.

@app.route('/register', methods=['POST'])
def register():
    return 'Регистрация'

Задача 5.

@app.route('/files/<path:file_path>')
def files(file_path):
    return f'Файл: {file_path}'

Нюансы и подводные камни

Порядок маршрутов

Порядок маршрутов важен. Более конкретные должны идти раньше общих.

# Правильно
@app.route('/posts/new')
def new_post():
    return 'Новый пост'

@app.route('/posts/<int:post_id>')
def post_detail(post_id):
    return f'Пост #{post_id}'

# Неправильно
@app.route('/posts/<int:post_id>')
def post_detail(post_id):
    return f'Пост #{post_id}'

@app.route('/posts/new')
def new_post():
    return 'Новый пост'  # Будет недоступен

Конвертер string

Конвертер string принимает любые символы, кроме слеша /.

@app.route('/user/<username>')
def profile(username):
    return username

# /user/anna → ok
# /user/ivan/petrov → ошибка 404

Переменные в URL

Переменные могут быть только в пути, не в строке запроса.

# Правильно: /user/anna
@app.route('/user/<username>')

# Неправильно: /user?username=anna
@app.route('/user')
def user():
    username = request.args.get('username')

Частые ошибки и как их избежать

Ошибка 1: Неправильное имя переменной

Имя в <> должно совпадать с параметром функции.

Ошибка 2: Забыл указать методы для POST

Всегда указывай methods=['POST'] для маршрутов, которые принимают POST.

Ошибка 3: Неправильный порядок маршрутов

Сначала конкретные, потом общие.

Шпаргалка

Что нужноКак пишется
Статический маршрут@app.route('/about')
Динамический маршрут@app.route('/user/<username>')
Конвертер int@app.route('/post/<int:post_id>')
Конвертер path@app.route('/files/<path:path>')
Методы HTTPmethods=['GET', 'POST']
Имя маршрута (endpoint)endpoint='about_page'
Получить URL по имениurl_for('index')

Заключение

Сегодня мы:

  • Изучили маршрутизацию в Flask
  • Научились использовать @app.route()
  • Разобрали динамические маршруты и конвертеры
  • Настроили методы HTTP

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×