Что такое отправка в django?

Я пытался обернуть голову вокруг метода отправки, особенно в Django (см. Пример кода ниже). Однако я не могу точно понять, что он делает. Я попытался получить понимание из документов Django, но не нашел их информативными по этой теме. По моему мнению, это слушатель, который слушает все события, происходящие на странице, но я не уверен, что это так? Благодарю.

class OrderDetail(DetailView):
    model = Order

    def **dispatch**(self, request, *args, **kwargs):
        try:
            user_check_id = self.request.session.get("user_checkout_id")
            user_checkout = UserCheckout.objects.get(id=user_check_id)
        except UserCheckout.DoesNotExist:
            user_checkout = UserCheckout.objects.get(user=request.user)
        except:
            user_checkout = None

        obj = self.get_object()
        if obj.user == user_checkout and user_checkout is not None:
            return super(OrderDetail, self).dispatch(request, *args, **kwargs)
        else:
            raise Http404

Ответы

Ответ 1

Метод отправки принимает запрос и в конечном итоге возвращает ответ. Обычно он возвращает ответ, вызывая (IE отправляя) другой метод, такой как get. Думайте об этом как о посреднике между запросами и ответами.

Обычно он просто решает, какой метод в классе (например, get(), post() и т.д.) Следует использовать (отправлено IE), основываясь на HTTP-методе, который использовался в запросе. Что-то вроде

def dispatch(self, request, *args, **kwargs):
    if request.method == 'GET':
        return self.get(*args, **kwargs)
    elif request.method == 'POST':
        return self.post(*args, **kwargs)
    elif #... and so on

Вы можете использовать свой собственный метод отправки, чтобы изменить это поведение, чтобы вызывать любые методы, которые вы хотите, которые должны возвращать HTTP-ответ или даже "перехватывать" и изменять аргументы, которые в конечном итоге достигают этих методов. Например, вы можете использовать это, чтобы блокировать/фильтровать определенные виды запросов или даже вводить аргументы...

def dispatch(self, request, *args, **kwargs):
    """Updates the keyword args to always have 'foo' with the value 'bar'"""
    if 'foo' in kwargs:
        # Block requests that attempt to provide their own foo value
        return HttpResponse(status_code=400)
    kwargs.update({'foo': 'bar'}) # inject the foo value
    # now process dispatch as it otherwise normally would
    return super().dispatch(request, *args, **kwargs)

Но ключевая концепция заключается в том, что он является точкой входа для запросов и в конечном итоге отвечает за возвращение ответа.

Ответ 2

Когда URL-адрес запроса совпадает с URL-адресом в вашем файле urls.py, django передает этот запрос в указанное вами представление. Запрос может быть передан только вызываемым функциям. Вот почему при использовании представлений на основе классов вы используете метод as_view(). Метод as_view() возвращает функцию, которую можно вызвать.

Затем эта функция создает экземпляр класса представления и вызывает его метод dispatch(). Затем метод dispatch просматривает запрос и решает, должен ли метод GET или POST класса представления обработать запрос.