it-swarm.com.de

wofür wird Versand in Django verwendet?

Ich habe versucht, die Versandmethode, insbesondere in Django, mit dem Kopf zu umgeben (siehe Codebeispiel unten). Ich kann jedoch nicht genau herausfinden, was es tut. Ich habe versucht, von den Django-Dokumenten Verständnis zu erlangen, fand sie jedoch nicht als informativ zu diesem Thema. Nach meinem Verständnis ist es ein Listener, der alle Ereignisse auf einer Seite abhört, aber ich bin nicht sicher, ob dies der Fall ist. Vielen Dank.

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

Die Versandmethode nimmt die Anfrage auf und gibt schließlich die Antwort zurück. Normalerweise gibt es eine Antwort zurück, indem (IE dispatching to) eine andere Methode wie get aufgerufen wird. Betrachten Sie es als Zwischenhändler zwischen Anfragen und Antworten.

Normalerweise entscheidet es einfach, welche Methode in der Klasse (z. B. get(), post() usw.) (IE dispatched ) verwendet werden soll, basierend auf der in der Anforderung verwendeten HTTP-Methode. So etwas wie

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

Sie können Ihre eigene Dispatch-Methode verwenden, um dieses Verhalten zu ändern, um die gewünschten Methoden aufzurufen, die die HTTP-Antwort zurückgeben sollen, oder sogar "Intercept" (Abfangen) und Ändern der Argumente, die diese Methoden letztendlich erreichen. Sie können dies beispielsweise verwenden, um bestimmte Arten von Anforderungen zu blockieren/filtern oder sogar Argumente einzufügen.

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)

Das Schlüsselkonzept ist jedoch, dass dies der Einstiegspunkt für Anfragen ist und letztendlich für die Rückgabe der Antwort verantwortlich ist.

21
sytech

Wenn eine Anforderungs-URL mit einer URL in Ihrer Datei urls.py übereinstimmt, leitet Django diese Anfrage an die von Ihnen angegebene Ansicht weiter. Die Anforderung kann nur an aufrufbare Funktionen übergeben werden. Aus diesem Grund verwenden Sie bei klassenbasierten Ansichten die Methode as_view(). Die as_view()-Methode gibt eine Funktion zurück, die aufgerufen werden kann. 

Diese Funktion erstellt dann eine Instanz der Ansichtsklasse und ruft ihre dispatch()-Methode auf. Die Versandmethode betrachtet dann die Anforderung und entscheidet, ob die Methode GET oder POST der Ansichtsklasse die Anforderung verarbeiten soll.

0
Richard Ackon