Привет! Веб-приложения часто используют параметры в URL: профиль пользователя (/user/anna), страница товара (/product/42), поиск (/search?q=flask). Flask предоставляет удобные способы для работы с такими параметрами.
В этой статье мы разберём:
- Динамические маршруты (Dynamic Routing)
- Конвертеры типов
- Параметры запроса (Query String)
- Практические примеры
- Что нужно знать перед началом
- Основная часть
- Динамические маршруты
- Конвертеры типов
- Несколько параметров в URL
- Параметры запроса (Query String)
- Пример: профиль пользователя
- Пример: интернет-магазин
- Обработка ошибок при передаче параметров
- Задачи для закрепления
- Нюансы и подводные камни
- Кодирование URL
- Параметры по умолчанию
- Проверка типа
- Частые ошибки и как их избежать
- Ошибка 1: Неправильное имя переменной
- Ошибка 2: Забыл значение по умолчанию
- Ошибка 3: Неправильный тип конвертера
- Шпаргалка
- Заключение
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Flask
- Базовое понимание маршрутов
Совет: В Flask параметры можно передавать двумя способами: в самом URL (динамические маршруты) или в строке запроса (после
?).
Основная часть
Динамические маршруты
Динамические маршруты позволяют передавать параметры прямо в URL.
Синтаксис:
@app.route('/path/<variable>')
def view(variable):
return f"Значение: {variable}"Пример:
from flask import Flask
app = Flask(__name__)
@app.route('/user/<username>')
def profile(username):
return f"Профиль пользователя: {username}"
if __name__ == '__main__':
app.run(debug=True)Результат:
/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(post_id):
return f"Пост №{post_id}" # post_id — int
@app.route('/product/<float:price>')
def product(price):
return f"Цена: {price}" # price — float
@app.route('/files/<path:file_path>')
def file(file_path):
return f"Файл: {file_path}" # file_path может содержать слешиСовет: Если не указать конвертер, Flask использует
string(строка без слешей).
Несколько параметров в URL
Можно передавать несколько параметров:
@app.route('/post/<int:year>/<int:month>/<int:day>')
def date_page(year, month, day):
return f"Дата: {year}-{month:02d}-{day:02d}"
# /post/2025/12/31 → Дата: 2025-12-31Параметры запроса (Query String)
Параметры запроса передаются после ? в URL: /search?q=flask&page=2.
Для их получения используется request.args:
from flask import Flask, request
app = Flask(__name__)
@app.route('/search')
def search():
query = request.args.get('q', '')
page = request.args.get('page', 1, type=int)
return f"Поиск: {query}, Страница: {page}"
# /search?q=flask&page=3 → Поиск: flask, Страница: 3
# /search → Поиск: , Страница: 1Параметры request.args.get():
| Аргумент | Назначение |
|---|---|
key | Имя параметра (обязательный) |
default | Значение по умолчанию, если параметра нет |
type | Тип, в который преобразуется значение |
Совет: Всегда указывай значение по умолчанию, чтобы избежать ошибок.
Пример: профиль пользователя
from flask import Flask, request, render_template_string
app = Flask(__name__)
# Динамический маршрут
@app.route('/user/<string:username>')
def profile(username):
# Данные пользователя (заглушка)
users = {
'anna': {'name': 'Анна', 'age': 25},
'ivan': {'name': 'Иван', 'age': 30}
}
if username in users:
user = users[username]
return f"Профиль: {user['name']}, Возраст: {user['age']}"
else:
return "Пользователь не найден", 404
# Маршрут с параметрами запроса
@app.route('/search')
def search():
query = request.args.get('q', '').strip()
if query:
return f"Результаты поиска: {query}"
else:
return "Введите поисковый запрос"Пример: интернет-магазин
@app.route('/product/<int:product_id>')
def product_page(product_id):
products = {
1: {'name': 'Ноутбук', 'price': 1000},
2: {'name': 'Телефон', 'price': 500},
3: {'name': 'Наушники', 'price': 100}
}
product = products.get(product_id)
if product:
return f"Товар: {product['name']}, Цена: {product['price']}$"
else:
return "Товар не найден", 404
@app.route('/products')
def product_list():
category = request.args.get('category', 'все')
sort = request.args.get('sort', 'name')
return f"Категория: {category}, Сортировка: {sort}"Обработка ошибок при передаче параметров
@app.route('/age/<int:age>')
def age_check(age):
if age < 0 or age > 120:
return "Неверный возраст", 400
return f"Возраст: {age}"
@app.route('/find')
def find_user():
user_id = request.args.get('id', type=int)
if user_id is None:
return "Укажите id пользователя", 400
return f"Поиск пользователя #{user_id}"Задачи для закрепления
Задача 1. Создай маршрут для страницы блога с параметром slug.
Задача 2. Создай маршрут для страницы товара с параметром id (int).
Задача 3. Создай маршрут для поиска с параметром q (строка запроса).
Задача 4. Создай маршрут с двумя параметрами: year и month.
Задача 5. Добавь обработку ошибки, если параметр отсутствует.
Ответы:
Задача 1.
@app.route('/blog/<string:slug>')
def blog_post(slug):
return f"Блог: {slug}"Задача 2.
@app.route('/product/<int:product_id>')
def product(product_id):
return f"Товар #{product_id}"Задача 3.
@app.route('/search')
def search():
q = request.args.get('q', '')
return f"Поиск: {q}"Задача 4.
@app.route('/archive/<int:year>/<int:month>')
def archive(year, month):
return f"Архив: {year}-{month:02d}"Задача 5.
@app.route('/user/<username>')
def user(username):
if not username:
return "Имя пользователя не указано", 400
return f"Пользователь: {username}"Нюансы и подводные камни
Кодирование URL
Специальные символы должны быть закодированы:
from urllib.parse import quote, unquote
# Кодирование
encoded = quote("hello world") # hello%20world
# Декодирование
decoded = unquote("hello%20world") # hello worldПараметры по умолчанию
Всегда используй значения по умолчанию в request.args.get().
Проверка типа
Используй type в request.args.get() для преобразования:
page = request.args.get('page', 1, type=int)Частые ошибки и как их избежать
Ошибка 1: Неправильное имя переменной
Имя переменной в <> должно совпадать с параметром функции.
Ошибка 2: Забыл значение по умолчанию
Всегда указывай значение по умолчанию в get().
Ошибка 3: Неправильный тип конвертера
Используй правильный конвертер для типа данных.
Шпаргалка
| Что нужно | Как пишется |
|---|---|
| Параметр в URL | @app.route('/user/<username>') |
| Параметр с типом | @app.route('/post/<int:post_id>') |
| Несколько параметров | @app.route('/<int:y>/<int:m>/<int:d>') |
| Параметр запроса | request.args.get('key', default, type=int) |
| Кодировать URL | quote("text") |
| Декодировать URL | unquote("text%20") |
Заключение
Сегодня мы:
- Научились передавать параметры в URL
- Использовали динамические маршруты
- Использовали конвертеры типов
- Обрабатывали параметры запроса
- Примеры из реальной жизни







