Модуль 7

Views: function-based views

Ось урок, створений спеціально для тебе у стилі 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. 🧩 Підсумок

Отже, друзі, що ми сьогодні дізналися?

  1. View — це серце логіки вашого сайту. Без неї URL — це дорога в нікуди.
  2. Function-Based View — це звичайна Python-функція, яка приймає request і повертає response.
  3. Ми навчилися робити динамічні сторінки, які реагують на дії користувача.

Тепер ви вмієте створювати сторінки, які не просто "висять" статично, а думають і працюють.

🤔 Тизер: Function-Based Views — це чудово і просто. Але уявіть, що у вас на сайті 50 сторінок, і на кожній треба перевіряти, чи залогінений користувач. Копіювати один і той самий код 50 разів у кожну функцію? Це порушує принцип DRY (Don't Repeat Yourself).

Чи є спосіб зробити це елегантніше? О, так. На наступному занятті ми познайомимось із Class-Based Views (CBV) — об'єктно-орієнтованим підходом, який змінить ваше уявлення про архітектуру коду.

А поки — практикуйтесь із функціями! Успіхів! 🚀