Теперь, когда мы разобрались с преимуществами и особенностями CBV, давайте начнем писать код!
В этой лекции мы создадим наши первые Class-Based Views и изучим их основные возможности на практике.
1. Создание простого CBV
Class-Based Views (CBV) в Django — это классы, которые реализуют обработку HTTP-запросов. Они позволяют нам писать код структурированно, переиспользовать логику и легко настраивать поведение представлений.
Чтобы создать CBV, мы используем базовый класс View из модуля django.views. В отличие от FBV, где вся логика содержится в одной функции, CBV разделяют логику на отдельные методы класса, что делает представления более модульными.
Давайте создадим простейший CBV, который будет обрабатывать HTTP GET-запросы и возвращать строку "Hello, CBV!".
from django.http import HttpResponse
from django.views import View
# Определяем Class-Based View
class HelloCBV(View):
def get(self, request):
# Обработка GET-запроса
return HttpResponse("Hello, 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": "This is a GET request"})
def post(self, request):
# Обработка POST-запроса
return JsonResponse({"message": "This is a POST request"})
Использование 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": "Authentication required"}, status=401)
return super().dispatch(request, *args, **kwargs)
def get(self, request):
return JsonResponse({"message": "You are authenticated!"})
В этом примере метод dispatch перехватывает запрос и выполняет проверку аутентификации перед передачей управления методу get.
5. Организация кода и преимущества CBV
Использование CBV помогает структурировать код и уменьшить его дублирование. Вместо того чтобы дублировать логику для разных HTTP-методов, вы можете определить ее в одном месте (например, в методе dispatch или кастомном методе класса).
Когда использовать CBV
- Если представление сложное и может быть разделено на логические части.
- Когда требуется обработка нескольких типов запросов.
- Если есть возможность переиспользовать логику между разными представлениями.
Когда не использовать CBV
- Если представление простое и обрабатывает только один тип запроса.
- Когда вы только начинаете работать с Django, и CBV кажутся сложными.
6. Практическое задание
Попрактикуйтесь в создании CBV:
- Создайте CBV, который обрабатывает GET-запрос и возвращает список случайных чисел.
- Добавьте обработку POST-запроса, который принимает два числа и возвращает их произведение.
- Добавьте проверку авторизации в методе
dispatch.
Подумайте, как вы могли бы организовать этот код, чтобы он был читаемым и удобным для поддержки.
На этом этапе вы овладели базовыми навыками создания и настройки Class-Based Views в Django. Поздравляем! В следующей лекции вы узнаете, как работать с TemplateView — классом CBV, который упрощает отображение шаблонов.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ