web-dev-qa-db-fra.com

à quoi sert dispatch dans django?

J'ai essayé de comprendre la méthode d'envoi, en particulier à Django (voir l'exemple de code ci-dessous). Cependant, je n'arrive pas à comprendre exactement ce que cela fait. J'ai essayé de comprendre les documents Django, mais je ne les ai pas trouvés trop informatifs sur ce sujet. D'après ce que j'ai compris, il s'agit d'un auditeur qui écoute tous les événements se produisant sur une page, mais je ne suis pas sûr que ce soit le cas. Merci.

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

La méthode d'envoi prend la demande et renvoie finalement la réponse. Normalement, il renvoie une réponse en appelant (IE dispatching to) une autre méthode comme get. Considérez-le comme un intermédiaire entre les demandes et les réponses.

Normalement, il décide simplement quelle méthode de la classe (par exemple, get(), post(), etc.) doit être utilisée (IE dispatch ) en fonction de la méthode HTTP utilisée dans la demande. Quelque chose comme

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

Vous pouvez utiliser votre propre méthode de répartition pour modifier ce comportement et appeler toutes les méthodes souhaitées qui doivent renvoyer la réponse HTTP ou même «intercepter» et modifier les arguments qui atteignent ces méthodes. Par exemple, vous pouvez utiliser ceci pour bloquer/filtrer certains types de requêtes ou même injecter des arguments ...

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)

Mais le concept clé est qu’il s’agit du point d’entrée des demandes et de la réponse finale.

21
sytech

Lorsqu'une URL de requête correspond à une URL de votre fichier urls.py, Django transmet cette requête à la vue que vous avez spécifiée. La demande ne peut être transmise qu'à des fonctions appelables. C'est pourquoi, lorsque vous utilisez des vues basées sur des classes, vous utilisez la méthode as_view(). La méthode as_view() renvoie une fonction pouvant être appelée. 

Cette fonction crée ensuite une instance de la classe de vue et appelle sa méthode dispatch(). La méthode d'envoi examine ensuite la demande et décide si la méthode GET ou POST de la classe de vue doit gérer la demande.

0
Richard Ackon