it-roy-ru.com

для чего используется диспетчеризация в 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
12
Taylor Hardie

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

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

def dispatch(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(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)

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

21
sytech

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

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

0
Richard Ackon