JavaRush /Курси /Модуль 3: Django /Основи створення Class-Based Views (CBV)

Основи створення Class-Based Views (CBV)

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

Тепер, коли ми розібралися з перевагами та особливостями CBV, давайте почнемо писати код!

У цій лекції ми створимо наші перші Class-Based Views та вивчимо їх основні можливості на практиці.

1. Створення простого CBV

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

Щоб створити CBV, ми використовуємо базовий клас View з модуля django.views. На відміну від FBV, де вся логіка міститься в одній функції, CBV розділяють логіку на окремі методи класу, що робить представлення більш модульними.

Давайте створимо найпростіший CBV, який буде обробляти HTTP GET-запити і повертати рядок "Привіт, CBV!".

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

# Визначаємо Class-Based View
class HelloCBV(View):
    def get(self, request):
        # Обробка GET-запиту
        return HttpResponse("Привіт, CBV!")

У цьому коді:

  • Ми створили клас HelloCBV, успадкований від View.
  • Метод get обробляє HTTP GET-запити. Його задача — повернути HTTP-відповідь.

Прив'язка CBV до маршруту

Щоб використовувати наше представлення, потрібно прив'язати його до URL. Для цього ми використовуємо функцію as_view().

from django.urls import path
from .views import HelloCBV

urlpatterns = [
    path('hello/', HelloCBV.as_view(), name='hello_cbv'),
]

Функція as_view() перетворює клас на викликаєму функцію, яку Django може використовувати для обробки запитів. Це магія, яка дозволяє CBV працювати!

2. Перевизначення методів CBV

Тепер давайте подивимося, як перевизначати методи CBV для обробки інших HTTP-запитів (POST, PUT, DELETE і т.д.). Основні методи, які можна перевизначити у CBV, це:

  • get(self, request, *args, **kwargs) — обробка GET-запитів.
  • post(self, request, *args, **kwargs) — обробка POST-запитів.
  • put(self, request, *args, **kwargs) — обробка PUT-запитів.
  • delete(self, request, *args, **kwargs) — обробка DELETE-запитів.

Приклад обробки різних HTTP-запитів

Створимо CBV, який обробляє як GET, так і POST-запити.

from django.http import JsonResponse
from django.views import View

class MultiMethodView(View):
    def get(self, request):
        # Обробка GET-запиту
        return JsonResponse({"message": "Це GET-запит"})

    def post(self, request):
        # Обробка POST-запиту
        return JsonResponse({"message": "Це POST-запит"})

Використання POST-запиту

При обробці POST-запитів можна читати передані дані з request.POST або request.body.

from django.http import JsonResponse
from django.views import View
import json

class PostDataView(View):
    def post(self, request):
        # Витягуємо дані з запиту
        data = json.loads(request.body)
        return JsonResponse({"received_data": data})

3. Створення CBV з кастомною логікою

Однією з потужних можливостей CBV є їх кастомізація. Ви можете додавати власні методи і використовувати їх у рамках логіки представлення.

Створимо CBV з кастомним методом, який буде обчислювати суму двох чисел, переданих через параметри запиту.

from django.http import JsonResponse
from django.views import View

class SumView(View):
    def get(self, request):
        # Витягуємо параметри запиту
        a = int(request.GET.get('a', 0))
        b = int(request.GET.get('b', 0))
        result = self.calculate_sum(a, b)
        return JsonResponse({"sum": result})

    def calculate_sum(self, a, b):
        # Кастомний метод для обчислення суми
        return a + b

Тут ми визначили метод calculate_sum, який виконує обчислення суми. Цей метод можна перевикористовувати в інших частинах класу, що робить код більш структурованим.

4. Перевизначення методу dispatch

Метод dispatch — це точка входу для CBV. Він викликається першим і визначає, який метод (get, post, put, і т.д.) буде викликаний у відповідь на запит.

Навіщо перевизначати dispatch? Ну, наприклад, ви можете додати логіку аутентифікації або логування запитів на рівні dispatch, щоб не дублювати цю логіку в кожному методі.

Приклад CBV з кастомним dispatch

Створимо CBV, який перевіряє, чи авторизований користувач перед обробкою запиту.

from django.http import JsonResponse
from django.views import View

class AuthRequiredView(View):
    def dispatch(self, request, *args, **kwargs):
        # Перевірка, чи авторизований користувач
        if not request.user.is_authenticated:
            return JsonResponse({"error": "Потрібна аутентифікація"}, status=401)
        return super().dispatch(request, *args, **kwargs)

    def get(self, request):
        return JsonResponse({"message": "Ви авторизовані!"})

У цьому прикладі метод dispatch перехоплює запит і виконує перевірку аутентифікації перед передачею управління методу get.

5. Організація коду та переваги CBV

Використання CBV допомагає структурувати код і зменшити його дублювання. Замість того, щоб дублювати логіку для різних HTTP-методів, ви можете визначити її в одному місці (наприклад, у методі dispatch або кастомному методі класу).

Коли використовувати CBV

  • Якщо представлення складне і може бути розділене на логічні частини.
  • Коли потрібна обробка кількох типів запитів.
  • Якщо є можливість повторно використовувати логіку між різними представленнями.

Коли не використовувати CBV

  • Якщо представлення просте і обробляє лише один тип запиту.
  • Коли ви тільки починаєте працювати з Django, і CBV здаються складними.

6. Практичне завдання

Попрактикуйтеся у створенні CBV:

  1. Створіть CBV, який обробляє GET-запит і повертає список випадкових чисел.
  2. Додайте обробку POST-запиту, який приймає два числа і повертає їхній добуток.
  3. Додайте перевірку авторизації в методі dispatch.

Подумайте, як ви могли б організувати цей код, щоб він був читабельним і зручним для підтримки.

На цьому етапі ви оволоділи базовими навичками створення та налаштування Class-Based Views у Django. Вітаємо! У наступній лекції ви дізнаєтеся, як працювати з TemplateView — класом CBV, який спрощує відображення шаблонів.

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