Метод dispatch
Метод dispatch является ключевым элементом классовых представлений (class-based views) в Django. Он отвечает за определение HTTP-метода запроса (GET, POST, PUT, DELETE и других) и перенаправление вызова на соответствующий метод-обработчик, например get или post. Если для запрошенного метода не определен обработчик, dispatch возвращает ошибку 405 (Method Not Allowed). Метод автоматически вызывается фреймворком при обработке запроса, но может быть переопределен для добавления дополнительной логики, такой как проверка прав доступа, кеширование или логирование.
Синтаксис
class MyView(View):
def dispatch(self, request, *args, **kwargs):
# Дополнительная логика перед обработкой
return super().dispatch(request, *args, **kwargs)
Параметры метода:
-
request- объект HTTP-запроса, содержащий информацию о текущем запросе; -
*argsи**kwargs- аргументы, переданные из конфигурации URL; -
возвращаемое значение - объект ответа HTTP (например,
HttpResponse).
Пример
Создадим представление, которое обрабатывает GET и POST запросы, а также переопределим метод dispatch для логирования каждого запроса:
from django.http import HttpResponse
from django.views import View
import logging
logger = logging.getLogger(__name__)
class MyView(View):
def dispatch(self, request, *args, **kwargs):
logger.info(f"Processing {request.method} request to {request.path}")
return super().dispatch(request, *args, **kwargs)
def get(self, request):
return HttpResponse("GET request processed")
def post(self, request):
return HttpResponse("POST request processed")
При отправке GET-запроса на это представление будет вызван метод get, а при POST-запросе - метод post. Перед этим в лог будет записана информация о запросе. Результат выполнения GET-запроса:
"GET request processed"
Пример
Переопределим dispatch для проверки прав доступа пользователя перед обработкой запроса:
from django.http import HttpResponse, HttpResponseForbidden
from django.views import View
class AdminView(View):
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return HttpResponseForbidden("You must be logged in")
if not request.user.is_staff:
return HttpResponseForbidden("Admin access required")
return super().dispatch(request, *args, **kwargs)
def get(self, request):
return HttpResponse("Admin panel")
Если пользователь не авторизован или не является администратором, будет возвращена ошибка 403. В противном случае запрос будет обработан методом get. Результат выполнения для неавторизованного пользователя:
"You must be logged in"
Пример
Используем dispatch для обработки запросов с кастомными HTTP-методами:
from django.http import HttpResponse
from django.views import View
class CustomView(View):
def dispatch(self, request, *args, **kwargs):
if request.method == 'PATCH':
return self.patch(request, *args, **kwargs)
return super().dispatch(request, *args, **kwargs)
def patch(self, request):
return HttpResponse("PATCH request processed")
def get(self, request):
return HttpResponse("GET request processed")
Теперь представление может обрабатывать PATCH-запросы, для которых не предусмотрен стандартный обработчик. Результат выполнения PATCH-запроса:
"PATCH request processed"