Ось урок, створений спеціально для тебе у стилі David Malan — енергійний, зрозумілий і орієнтований на те, щоб ти відчув себе розробником вже сьогодні.
Ми фокусуємось на Django, оскільки саме там термін "Function-Based Views" (FBV) є ключовим.
🎓 Тема уроку: Views (Function-Based Views) — Мозок вашого веб-сайту
Привіт, друзі! 👋 Ласкаво просимо на борт.
Сьогодні ми відкриємо капот веб-розробки та подивимось на деталь, яка змушує все рухатись. Ми вже знаємо про Models (де живуть дані) і Templates (як сайт виглядає). Але як вони зустрічаються? Хто бере дані з бази й кладе їх у красивий HTML?
Це — View (Представлення). А саме — старі добрі Function-Based Views.
1. 🔥 Вступ: проблема та мотивація
Уявіть, що ви приходите в ресторан. Ви сідаєте за столик і бачите меню (це наш інтерфейс). Ви кличете офіціанта і робите замовлення: "Хочу піцу Пепероні".
Офіціант (це наш веб-сервер) записує це і йде на кухню.
А тепер увага: хто реально готує піцу? Офіціант? Ні. Меню? Ні. Готує шеф-кухар.
У веб-розробці:
* Ваша адреса в браузері (/pizza/pepperoni) — це замовлення.
* View (функція-представлення) — це той самий шеф-кухар 👨🍳.
Без View ваш сайт — це просто порожній ресторан без кухаря. Ви можете скільки завгодно клікати на посилання, але якщо немає функції, яка обробить цей клік і "приготує" відповідь, ви залишитесь голодними (або отримаєте помилку 404).
Питання до вас: Якби ви писали програму на Python, яка має привітати користувача на ім'я, що б ви використали? Правильно, звичайну функцію. Веб працює так само!
2. 🧠 Теоретична база (без сухої академічності)
Давайте заглянемо "під капот". Що таке Function-Based View (FBV) технічно?
Це просто Python-функція. Серйозно, звичайна def my_function():.
Але є два правила гри. Щоб ця функція стала "веб-контролером", вона повинна:
1. Приймати першим аргументом об'єкт запиту (request). Це "папірець із замовленням" від офіціанта. Там написано все: хто прийшов, з якого браузера, які дані передав.
2. Повертати об'єкт відповіді (HttpResponse). Це "готова страва" на тарілці.
Схема процесу (Request-Response Cycle):
Користувач (Браузер) ➡️ Запит (Request) ➡️ URL (Диспетчер)
⬇️
🔵 VIEW (ФУНКЦІЯ) 🔵
(Тут відбувається магія!)
⬇️
Користувач (Браузер) ⬅️ Відповідь (Response) ⬅️ HTML / JSON
Що треба запам'ятати залізобетонно:
View — це місце, де приймаються рішення. View бере
request(вхід) і повертаєresponse(вихід).
Все інше — робота з базою даних, логіка, розрахунки — відбувається всередині цієї функції.
3. 🧪 Приклади (від простого до реального)
Приклад 1: "Hello, World!" (Найпростіший шеф-кухар)
Припустімо, у нас є файл views.py. Що ми там напишемо?
from django.http import HttpResponse
# Найпростіша view
def index(request):
return HttpResponse("Привіт, світ! Це моя перша View!")
Що тут відбулося? Ми не читали базу даних, не вантажили красиві HTML-шаблони. Ми просто взяли запит і "плюнули" назад чистий текст. Це якби кухар виніс вам просто шматок хліба. Але це працює!
Приклад 2: Динаміка (Трохи магії)
Статичний текст — це нудно. Давайте зробимо так, щоб сайт вітав нас по-різному залежно від ситуації.
Запитання до студента: Як думаєте, як ми можемо передати ім'я конкретного користувача у функцію?
Правильно! Через аргументи функції.
from django.http import HttpResponse
import datetime
def current_time(request):
now = datetime.datetime.now()
html = f"<html><body>Зараз на годиннику: {now}</body></html>"
return HttpResponse(html)
Тепер щоразу, коли ви оновлюєте сторінку, час змінюється. View виконується заново при кожному запиті!
Приклад 3: Реальна задача (Магазин)
А тепер — як це виглядає в реальному проєкті, наприклад, у магазині кросівок.
from django.shortcuts import render
from .models import Product # Уявімо, що в нас є база товарів
def product_detail(request, product_id):
# 1. Отримуємо дані (йдемо в комору за інгредієнтами)
# Ми шукаємо товар за його ID
item = Product.objects.get(id=product_id)
# 2. Логіка (готуємо страву)
price_with_tax = item.price * 1.2 # Додаємо податок, наприклад
# 3. Відповідь (сервіруємо)
# Ми віддаємо дані в HTML-шаблон
context = {
'product': item,
'final_price': price_with_tax
}
return render(request, 'product_page.html', context)
Розбір польотів:
1. product_id прийшов з URL (наприклад, myshop.com/product/5).
2. View знайшла в базі товар №5.
3. Порахувала нову ціну.
4. Запакувала все це і віддала гарний HTML (функція render робить магію перетворення шаблону на рядок тексту).
4. 🛠 Практична частина
Час забруднити руки кодом! Відкрийте свій редактор (VS Code, PyCharm або навіть блокнот) і спробуйте подумки або реально вирішити ці задачі.
Завдання 1: "Ехо"
Напишіть функцію-view echo_view(request), яка просто повертає текст "Я працюю!".
Завдання 2: "Калькулятор віку"
Напишіть view, яка приймає аргумент year_born (рік народження) і повертає текст: "Вам приблизно X років".
(Підказка: відніміть рік народження від поточного року).
Завдання 3: "Пошук помилки" 🐞 Студент написав код, але сервер видає помилку. Що не так?
def my_view(request):
text = "Привіт, друже"
# Чогось тут не вистачає...
(Підказка: що завжди має повертати view?)
Завдання 4: Міні-кейс "Випадкове число"
Напишіть view, яка при кожному оновленні сторінки показує випадкове число від 1 до 100. Вам знадобиться import random.
Завдання 5: А що, якщо...?
У завданні з магазином (Приклад 3) ми шукали Product.objects.get(id=product_id).
А що буде, якщо користувач введе ID товару, якого не існує (наприклад, 99999)?
(Подумайте, як програма має відреагувати, щоб не "впасти" з гуркотом).
5. 💡 Мислення як у розробника
Як відрізнити новачка від профі, дивлячись на їхні View-функції?
❌ Типова помилка новачка: "Fat View" (Товста View)
Новачок намагається запхати у View все: перевірку даних, складні математичні розрахунки, надсилання емейлів, генерацію PDF... У результаті функція має 200 рядків коду. Її неможливо читати й тестувати.
✅ Як думає профі: "Skinny View" (Худа View)
Профі знає: View — це лише регулювальник. * Вона каже: "Модель, дай дані". * Вона каже: "Утиліта, порахуй податок". * Вона каже: "Шаблон, намалюй це".
Золоте правило: Якщо ваша функція-view не вміщається на один екран — ви, ймовірно, робите щось не так. Виносьте логіку в окремі файли (utils.py, services.py) або в методи моделей.
💡 Порада з практики:
Завжди називайте views зрозуміло. def index(request): — це ок для головної. Але краще def product_list(request): або def user_profile(request):. Код читають люди, а не лише машини!
6. 🧩 Підсумок
Отже, друзі, що ми сьогодні дізналися?
- View — це серце логіки вашого сайту. Без неї URL — це дорога в нікуди.
- Function-Based View — це звичайна Python-функція, яка приймає
requestі повертаєresponse. - Ми навчилися робити динамічні сторінки, які реагують на дії користувача.
Тепер ви вмієте створювати сторінки, які не просто "висять" статично, а думають і працюють.
🤔 Тизер: Function-Based Views — це чудово і просто. Але уявіть, що у вас на сайті 50 сторінок, і на кожній треба перевіряти, чи залогінений користувач. Копіювати один і той самий код 50 разів у кожну функцію? Це порушує принцип DRY (Don't Repeat Yourself).
Чи є спосіб зробити це елегантніше? О, так. На наступному занятті ми познайомимось із Class-Based Views (CBV) — об'єктно-орієнтованим підходом, який змінить ваше уявлення про архітектуру коду.
А поки — практикуйтесь із функціями! Успіхів! 🚀