Ось готовий урок на тему Path parameters, створений у стилі CS50 (David Malan).
🎓 Урок: Path Parameters (Параметри шляху)
Привіт, друзі! 👋 Це CS50, і сьогодні ми розберемо тему, яка перетворить ваш код із набору жорстких інструкцій на гнучку, живу систему.
Ми говоримо про Path Parameters (параметри шляху).
1. 🔥 Вступ: проблема та мотивація
Уявіть, що ви створюєте свій власний Instagram. У вас є мільйон користувачів. Як ви напишете код, щоб показати профіль кожного з них?
Невже ви будете писати окрему функцію для кожного юзера?
@app.get("/users/andrii")
def get_andrii():
return "Це профіль Андрія"
@app.get("/users/olena")
def get_olena():
return "Це профіль Олени"
А якщо зареєструється ще 1000 людей? Ви що, будете сидіти всю ніч і копіювати цей код тисячу разів? Звісно, ні. Це безумство. 🤯
Тут виникає проблема: нам потрібен один універсальний маршрут, який може обробляти будь-яке ім'я користувача.
Аналогія: Уявіть готель. На дверях кожного номера є табличка: 101, 102, 103. Прибиральнику не дають окрему інструкцію для кожної кімнати ("Прибери 101", "Прибери 102"...). Йому кажуть: "Прибери кімнату номер X", де X — це змінна.
У вебі цей "номер кімнати" і є Path Parameter. Без цього ми б не мали ні Facebook, ни Amazon, ні Вікіпедії.
2. 🧠 Теоретична база (без сухої академічності)
Що таке Path Parameter?
Path Parameter — це змінна частина URL-адреси, яку сервер "вирізає" з посилання і передає вашій функції як звичайну змінну.
Як це працює "під капотом"?
Коли ви заходите на сайт shop.com/products/42:
1. Ваш браузер надсилає запит на цей URL.
2. Сервер (ваш бекенд) дивиться на свої маршрути. Він не шукає точний збіг /products/42.
3. Він шукає шаблон: /products/{id}.
4. Сервер розуміє: "Ага! Користувач хоче продукт, і замість {id} він написав 42".
5. Він запускає вашу функцію і передає їй id = 42.
🔑 Що треба запам'ятати залізно:
- Параметр шляху — це частина адреси (не те, що йде після
?). - Він використовується для ідентифікації конкретного ресурсу (конкретний юзер, конкретний товар, конкретна стаття).
3. 🧪 Приклади (від простого до реального)
Давайте подивимось на код. Я буду використовувати синтаксис, схожий на Python (FastAPI/Flask), бо він читається як псевдокод, але логіка однакова і для JavaScript (Express), і для Go, і для Java.
Приклад 1: "Привіт, {хтось}!"
Найпростіший випадок. Ми хочемо вітатися з будь-ким.
# Фігурні дужки {} означають, що це змінна
@app.get("/hello/{name}")
def say_hello(name):
return f"Привіт, {name}!"
Питання до вас: Якщо я перейду за посиланням /hello/David, що поверне сервер?
(Пауза на подумати...)
Правильно: "Привіт, David!". А змінна name всередині функції отримає значення "David".
Приклад 2: Типізація (Це важливо!)
Уявіть інтернет-магазин. У кожного товару є числовий ID.
@app.get("/items/{item_id}")
def get_item(item_id: int): # Ми вказуємо, що чекаємо число!
return {"item_id": item_id, "name": "Якийсь товар"}
Що буде, якщо я перейду на /items/banana?
Ваш код очікує число (int), а ви передали слово "banana".
Розумний фреймворк автоматично видасть помилку (наприклад, 422 Validation Error). І це круто! Це захищає вашу базу даних від сміття.
Приклад 3: Кілька параметрів
Шлях може бути довгим і мати кілька змінних. Наприклад, категорія і ID товару.
@app.get("/catalog/{category_name}/products/{product_id}")
def get_product(category_name, product_id):
return {
"category": category_name,
"product": product_id,
"message": f"Ви шукаєте товар {product_id} у категорії {category_name}"
}
URL: /catalog/electronics/products/55
Результат:
* category_name = "electronics"
* product_id = "55"
Бачите? Ми розбили URL на змістові шматки.
4. 🛠 Практична частина
А тепер ваша черга! Відкрийте редактор коду (або уявіть його) і вирішіть ці задачі.
🔹 Завдання 1: Відлуння
Напишіть маршрут /echo/{word}, який просто повертає те саме слово, яке ввів користувач, але тричі.
Вхід: /echo/hello $\to$ Вихід: "hello hello hello"
🔹 Завдання 2: Калькулятор в URL
Створіть маршрут /add/{a}/{b}, який приймає два числа і повертає їх суму.
Вхід: /add/10/5 $\to$ Вихід: 15
🔹 Завдання 3: Виправ помилку (Debug) У вас є такий код:
@app.get("/users/{user_id}")
def get_user(user_id):
return "User ID is " + user_id
@app.get("/users/me")
def get_current_user():
return "Це я, адмін!"
Ви переходите на /users/me, але сервер каже: "User ID is me". Чому не спрацював другий маршрут? Як це виправити?
(Підказка: порядок має значення!)
🔹 Завдання 4: Міні-кейс "Блог"
Придумайте структуру URL для доступу до коментарів конкретної статті.
Наприклад, у вас є стаття з id=100 і ви хочете отримати коментар з id=5. Як виглядатиме шлях? Напишіть сигнатуру функції.
🔹 Завдання 5: А що, якщо...?
Що має зробити ваш код, якщо користувач перейшов на /items/9999, а товару з таким ID у вашій базі даних немає?
(Подумайте про HTTP статус-коди. 200 OK тут не підходить).
5. 💡 Мислення як у розробника
Ось де ми відокремлюємо новачків від профі. Як мислить інженер?
-
Порядок маршрутів (Route Order) — це класична пастка.
- Проблема: Комп'ютер читає код згори вниз. Якщо ви поставите загальний шаблон
/users/{id}вище, ніж конкретний/users/me, то "me" буде сприйнято якid. - Рішення: Завжди ставте конкретні (статичні) маршрути вище за динамічні шаблони. Спочатку винятки, потім правила.
- Проблема: Комп'ютер читає код згори вниз. Якщо ви поставите загальний шаблон
-
Валідація типів.
- Не вірте користувачеві. Якщо
idмає бути числом — вимагайте число на рівні коду. Якщо це UUID — перевіряйте формат. Це вбереже вас від SQL-ін'єкцій та зламаної логіки.
- Не вірте користувачеві. Якщо
-
Семантика URL (RESTful design).
- Погано:
/get_user_by_id/{id}(дієслово в URL зайве, метод GET і так це каже). - Добре:
/users/{id}(іменник, чітко і ясно).
- Погано:
6. 🧩 Підсумок
Отже, що ми маємо в сухому залишку?
- Path Parameters дозволяють створювати динамічні URL-адреси.
- Вони діють як змінні у вашому коді.
- Вони ідеальні для пошуку конкретних ресурсів (ID, username, slug).
- Порядок написання маршрутів у коді критично важливий.
Тепер ви вмієте: створювати API, яке масштабується на мільйони користувачів, не пишучи мільйон рядків коду.
🚀 Що далі? Ви запитаєте: "Добре, Девіде, я можу знайти конкретний товар. А як мені знайти всі дешеві товари або відсортувати їх за ціною?" Для цього нам знадобляться Query Parameters (параметри запиту). Але про це — наступного разу.
Це був CS50. Щасти вам з кодом!