2017-12-14 5 views
0

Ich habe versucht, mich mit der Versandmethode zu beschäftigen, besonders in Django (siehe Codebeispiel unten). Allerdings kann ich nicht genau herausfinden, was es tut. Ich habe versucht, die Django-Dokumente zu verstehen, fand sie aber zu diesem Thema nicht informativ. Nach meinem Verständnis ist es ein Zuhörer, der auf alle Ereignisse auf einer Seite hört, aber ich bin mir nicht sicher, ob dies der Fall ist? Vielen Dank.Wofür wird der Versand im Django verwendet?

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 

Antwort

0

Die Diaptch-Methode nimmt die Anfrage auf und gibt die Antwort zurück. Normalerweise gibt es eine Antwort von einer anderen Methode wie get zurück. Stellen Sie sich das als Vermittler zwischen Anfragen und Antworten vor.

Normalerweise entscheidet es einfach, welche Methode in der Klasse (get(),) usw. basierend auf der HTTP-Methode verwendet werden sollte, die in der Anfrage verwendet wurde. 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 Ihre eigene Versand-Methode verwenden, können dieses Verhalten zu ändern, was auch immer Methoden, die Sie, dass anrufen mögen, sollte die HTTP-Antwort zurückgeben oder auch die Argumente ändern, die letztlich diese Methoden erreichen oder bestimmte Arten von Anfragen blockieren .. Es ist letztlich verantwortlich für die Rückmeldung.

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) 
+0

Vielen Dank für diese Erklärung. Das macht jetzt viel mehr! –