Передача параметров в URL

Передача параметров в URL Flask

Привет! Веб-приложения часто используют параметры в URL: профиль пользователя (/user/anna), страница товара (/product/42), поиск (/search?q=flask). Flask предоставляет удобные способы для работы с такими параметрами.

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

  • Динамические маршруты (Dynamic Routing)
  • Конвертеры типов
  • Параметры запроса (Query String)
  • Практические примеры

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

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

  • Установленный 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>
uuidUUID/<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)
Кодировать URLquote("text")
Декодировать URLunquote("text%20")

Заключение

Сегодня мы:

  • Научились передавать параметры в URL
  • Использовали динамические маршруты
  • Использовали конвертеры типов
  • Обрабатывали параметры запроса
  • Примеры из реальной жизни

КВИЗ

Что дальше?

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