Представления Django - FBV и CBV

FBV(представления на основе функций)Представления на основе функций используют функции в представлениях для обработки запросов.

CBV(представления на основе классов)Представления на основе классов используют классы в представлениях для обработки запросов.

FBV

Фактически мы использовали представления на основе функций во всех предыдущих главах — то есть использовали функции для обработки запросов пользователей. См. следующий пример:

Конфигурация маршрута:

файл urls.py

urlpatterns = [
    path("login/", views.login),
]

файл views.py

from django.shortcuts import render,HttpResponse

def login(request):
    if request.method == "GET":
        return HttpResponse("метод GET")
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        if user == "example" and pwd == "123456":
            return HttpResponse("метод POST")
        else:
            return HttpResponse("метод POST 1")

Если мы напрямую откроем http://127.0.0.1:8000/login/ в браузере, вывод будет:

GET 方法

CBV

Представления на основе классов используют классы для обработки запросов пользователей. Разные запросы могут обрабатываться разными методами внутри класса, что значительно повышает читаемость кода.

Определённый класс должен наследоваться от родительского класса View, поэтому сначала нужно импортировать библиотеку:

from django.views import View

Перед выполнением метода, соответствующего запросу, сначала выполняется метод dispatch (до методов get/post/put...). Метод dispatch() вызывает подходящий метод для обработки запроса в зависимости от типа запроса.

На самом деле, из того, что мы узнали ранее, мы знаем, что URL в Django сопоставляет запрос с вызываемой функцией, а не с классом. Как же тогда реализуются представления на основе классов? В основном используется статический метод as_view(), предоставляемый родительским классом View. Метод as_view — это внешний интерфейс представления на основе классов. Он возвращает функцию представления. После вызова запрос передаётся методу dispatch, который затем обрабатывает различные методы в соответствии с типом запроса.

Конфигурация маршрута:

файл urls.py

urlpatterns = [
    path("login/", views.Login.as_view()),
]

файл views.py

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

class Login(View):
    def get(self,request):
        return HttpResponse("метод GET")

    def post(self,request):
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        if user == "example" and pwd == "123456":
            return HttpResponse("метод POST")
        else:
            return HttpResponse("метод POST 1")

Если мы напрямую откроем http://127.0.0.1:8000/login/ в браузере, вывод будет:

GET 方法
Другие расширения