Тепер, коли ми розібралися з перевагами та особливостями 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:
- Створіть CBV, який обробляє GET-запит і повертає список випадкових чисел.
- Додайте обробку POST-запиту, який приймає два числа і повертає їхній добуток.
- Додайте перевірку авторизації в методі
dispatch.
Подумайте, як ви могли б організувати цей код, щоб він був читабельним і зручним для підтримки.
На цьому етапі ви оволоділи базовими навичками створення та налаштування Class-Based Views у Django. Вітаємо! У наступній лекції ви дізнаєтеся, як працювати з TemplateView — класом CBV, який спрощує відображення шаблонів.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ