Привет! В Flask маршрутизация — это процесс связывания URL-адресов с функциями-представлениями (views). За это отвечает декоратор @app.route().
В этой статье мы разберём:
- Что такое маршрутизация
- Синтаксис
@app.route() - Динамические маршруты
- Конвертеры типов
- Методы HTTP в маршрутах
- Что нужно знать перед началом
- Основная часть
- Что такое маршрутизация
- Синтаксис @app.route()
- Статические маршруты
- Динамические маршруты
- Конвертеры типов
- Несколько параметров в URL
- Методы HTTP в маршрутах
- Именованные маршруты (endpoint)
- Полный пример
- Задачи для закрепления
- Нюансы и подводные камни
- Порядок маршрутов
- Конвертер string
- Переменные в URL
- Частые ошибки и как их избежать
- Ошибка 1: Неправильное имя переменной
- Ошибка 2: Забыл указать методы для POST
- Ошибка 3: Неправильный порядок маршрутов
- Шпаргалка
- Заключение
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный 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Параметры:
| Параметр | Назначение |
|---|---|
rule | URL-маршрут (обязательный) |
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> |
uuid | UUID | /<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>') |
| Методы HTTP | methods=['GET', 'POST'] |
| Имя маршрута (endpoint) | endpoint='about_page' |
| Получить URL по имени | url_for('index') |
Заключение
Сегодня мы:
- Изучили маршрутизацию в Flask
- Научились использовать
@app.route() - Разобрали динамические маршруты и конвертеры
- Настроили методы HTTP







