JavaRush /Курси /Модуль 3: Django /Що таке Class-Based Views (CBV)

Що таке Class-Based Views (CBV)

Модуль 3: Django
Рівень 4 , Лекція 0
Відкрита

Привіт, розробники! Сьогодні поговоримо про один із найпотужніших інструментів Django — Class-Based Views (CBV). Якщо ви вже освоїли Function-Based Views (FBV), час познайомитися з більш просунутим підходом. CBV часто викликають суперечливі почуття у розробників: одні в захваті від їхньої гнучкості, інші вважають їх надмірно складними. Давайте розберемося, чому CBV стали важливою частиною Django

і як їх можливості можуть покращити ваш проєкт.

1. Вступ до Class-Based Views

Class-Based Views (або, по-дружньому, CBV) — це представлення, написані на основі класів, а не функцій. Вони дозволяють інкапсулювати обробку запитів у методи класу, що робить ваш код більш модульним і зручним для повторного використання.

Якщо Function-Based Views можна уявити як "все в одній каструлі" — компактно, але не завжди охайно, то CBV — це організація процесів по контейнерах. Кожна дія — свій метод.

Приклад CBV:

from django.http import HttpResponse
from django.views import View

class MyView(View):
    def get(self, request):
        return HttpResponse('Привіт із CBV!')

 

Так, це воно. Все практично так само, як у FBV. Тільки тепер на основі класів.

Основні відмінності CBV від FBV

FBV — це строго функціональний підхід:

  • - Одна функція = одне представлення.
  • - Обробка запитів (GET, POST, і т.д.) реалізується в одному місці, що може призвести до нагромадження коду.

CBV — це об'єктно-орієнтований підхід:

  • Логіка запитів розділена по методах класу (get(), post(), ...).
  • Використання наслідування та перевизначення дозволяє легко розширювати функціонал і повторно використовувати код.

Для наочності, порівняємо:

FBV:

from django.shortcuts import render

def my_view(request):
    if request.method == 'GET':
        return render(request, 'index.html')

CBV:

from django.views import View
from django.shortcuts import render

class MyView(View):
    def get(self, request):
        return render(request, 'index.html')

Зверніть увагу, у CBV чітко зазначено, що метод "get" відповідає за обробку GET-запитів. Все розкладено по поличках!

Переваги використання CBV

  1. Повторне використання коду
    Привіт наслідуванню! CBV дозволяють створювати базові класи представлень, які легко адаптуються для нових задач. Наприклад, можна визначити загальний механізм аутентифікації та включити його у всі додаткові представлення через наслідування.

  2. Читабельність і підтримка
    Розділення логіки обробки запитів за методами класу (наприклад, get() і post()) покращує читабельність коду та його підтримку в довгостроковій перспективі.

  3. Підготовка до складних задач
    CBV ідеально підходять для роботи з об'єктами у вигляді списків або деталей. Наприклад, коли потрібно вивести список товарів (ListView) або надати детальну інформацію про продукт (DetailView).

  4. Використання Generic Views
    Django надає набір вже готових класів представлень (Generic Views), які роблять такі задачі, як CRUD-операції, неймовірно простими. Про це ми поговоримо на наступних лекціях.

Але не будемо поспішати, спочатку зрозуміємо базову структуру CBV.

2. Структура Class-Based Views

Як і будь-який клас у Python, CBV має методи та атрибути. Основні методи, які нас цікавлять:

  • dispatch(): відповідає за маршрутизацію запиту до відповідного методу (get(), post() і т.д.).
  • get(): обробляє GET-запити.
  • post(): обробляє POST-запити.
  • Інші методи, такі як put(), delete(), можна перевизначати за потреби.

Приклад базової структури:

from django.views import View

class ExampleView(View):
    def get(self, request):
        return HttpResponse('Це обробка GET-запиту')

    def post(self, request):
        return HttpResponse('Це обробка POST-запиту')

Огляд основних методів

  1. dispatch()
    Цей метод визначає, який метод класу має бути викликаний залежно від HTTP-методу запиту. Зазвичай, ви не перевизначаєте його, але можна додати свою логіку, якщо потрібно.

  2. get()
    Метод потрібен для обробки запитів типу GET. У ньому ви зазвичай створюєте логіку відображення сторінки або передачі даних.

  3. post()
    Метод для обробки даних, відправлених через форму або API.

3. Приклади застосування CBV

Давайте розглянемо приклади практичного використання CBV.

3.1. Приклад: проста обробка GET-запиту

Створимо представлення, яке відповість простим текстом на GET-запит:

from django.http import HttpResponse
from django.views import View

class GreetingView(View):
    def get(self, request):
        return HttpResponse('Привіт, Django світ!')

3.2. Приклад: перехід від FBV до CBV

У нас є FBV, який відповідає за відображення шаблону:

from django.shortcuts import render

def welcome_page(request):
    return render(request, 'welcome.html')

Тепер перепишемо його у CBV:

from django.views import View
from django.shortcuts import render

class WelcomePageView(View):
    def get(self, request):
        return render(request, 'welcome.html')

Зверніть увагу: поведінка ідентична, але CBV пропонує більше гнучкості для подальшого розширення.

3.3. Як CBV спрощують розробку

Уявіть сайт з десятками представлень, кожне з яких працює з GET або POST. Використовуючи CBV, ви можете створити базовий клас представлення із загальною логікою (наприклад, перевірка автентифікації), а потім повторно використовувати цей клас:

class AuthRequiredView(View):
    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return HttpResponse('Потрібна авторизація', status=401)
        return super().dispatch(request, *args, **kwargs)

class DashboardView(AuthRequiredView):
    def get(self, request):
        return HttpResponse('Ласкаво просимо до Панелі керування')

Тепер усі дочірні класи наслідують перевірку автентифікації. DRY (Don't Repeat Yourself) у всій красі!

На цьому етапі ви вже можете почати використовувати CBV для створення своїх проєктів. У наступних лекціях ми заглибимось у роботу з окремими типами CBV (наприклад, TemplateView, ListView) та побачимо, як застосовувати їх у реальних проєктах. А тепер повертайтеся до свого коду — і магія Django продовжиться!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ