0

Ich bin Praktikant und arbeite an einem Projekt, wo ich DRF API entwickeln, die mit der mobilen App interagieren müssen, die von meinem Kollegen mit Ionic Framework geschrieben wurde. Wir erstellen neue Benutzer. Meine Ansicht Methode ist folgende:Django REST API benutzerdefinierte Methoden für generische Ansichten

class NewUser(generics.CreateAPIView): 
    model = User 
    permission_classes = [permissions.AllowAny] 
    serializer_class = NewUserSerializer 

    def create(self, request, *args, **kwargs): 
     serializer = self.get_serializer(data=request.data) 
     serializer.is_valid(raise_exception=True) 
     self.perform_create(serializer) 
     headers = self.get_success_headers(serializer.data) 
     token, created = Token.objects.get_or_create(user=serializer.instance) 
     return Response({'token': token.key}, status=status.HTTP_201_CREATED, headers=headers) 

Wenn jemand will neue Benutzer über POST-Anforderung erstellen, wenn Benutzername noch genommen has't worden ist, dann API 201-Statuscode zurückgeben und in JSON-Token, wenn Benutzername bereits einge gibt 400 Status und Fehlermeldung in JSON zurück. Mein Kollege fordert mich auf, die Statusmeldung auf 200 zu ändern, wenn er versucht, einen Benutzernamen mit einem bereits vorhandenen Namen zu erstellen. Er sagt, dass er die ERROR-Antwort nicht konsumieren kann. Sein Code wie folgt aussieht:

$http.post(url,{ 
username:$scope.tel, 
password:$scope.passwd 
}).success(function(data){ 
alert(data); 
$ionicLoading.hide(); 
console.log(data); 
}) 

Frage: 1) Soll ich meine API zwicken 200 Status statt logischer 400 für Fehler 'user bereits registrieren' senden? Ich habe versucht, meinen Code zu ändern, aber ich konnte die Methode zum Überschreiben in CreateAPIView/ModelSerializer von DRF nicht finden. Ich beendete meine Ansicht Klasse Methode Umschreiben up:

@api_view(['POST']) 
def newUser(request): 
    """ 
    Saves a new user on the database 
    """ 
    if request.method == 'POST': 

     serializer = NewUserSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      token, created = Token.objects.get_or_create(user=serializer.instance) 
      return Response({'token': token.key}, status=status.HTTP_201_CREATED, headers=serializer.data) 
     else: 
      return Response(serializer.errors, status=status.HTTP_200_OK) 

Frage: 2) Wenn ich behaviorof API und Antwort-ändern möchten, welche Methode sollte ich außer Kraft setzen 3) Ich bin neu in Django und noch don‘ t qiute wissen, wo wir generische Ansichten VS verwenden sollten. @ .... Methoden

Antwort

0

200 vs 400 in diesem Fall ist meist Präferenz. 400 bedeutet "Falsche Anfrage". Dies ist im Allgemeinen korrekter für eine falsch formatierte Anfrage als für eine, die eine Bedingung nicht erfüllt.

200 ist ebenso angebracht, sie die richtigen Informationen vermittelt:

Ihre Anfrage gültig war, aber ich habe nicht einen neuen Datensatz erstellen.

In Bezug auf die Überschreibung. Der kürzeste Pfad besteht darin, die CreateAPIView.create zu überschreiben und den verwendeten Antwortcode zu ändern. Sie sollten auch vermeiden, das Standardverhalten von CreateAPIView durch den Aufruf super zu wiederholen.

class CreateUserView(generics.CreateAPIView): 
    model = User 
    permission_classes = [permissions.AllowAny] 
    serializer_class = NewUserSerializer 

    def create(self, request, *args, **kwargs): 
     response = super(CreateUserView, self).create(request, *args, **kwargs) 
     token, created = Token.objects.get_or_create(user=serializer.instance) 
     response.status = status.HTTP_200_OK 
     response.data = {'token': token.key} 
     return response 

Persönlich würde ich habe auch meine Handarbeit NewUserSerializer ein Token-Feld haben und das Token zu behandeln, damit ich nicht, dass die Arbeit in den View zu tun habe. Es gehört nicht in eine View.

+0

Vielen Dank für Ihre Aufmerksamkeit, aber Ihr Code vermisst den Teil, wo wir 'Serializer' erstellen. So gibt es globalen Namen nicht definiert Fehler in der Zeile 'Token, erstellt = Token.Objects.get_or_create (user = serializer.instance)' –

+0

Fair genug, alles, was wirklich zählt, ist die Änderung des Status der Antwort. Aber noch einmal, weil Sie hier eine falsche Trennung von Bedenken haben, führt dies dazu, dass Sie den Code duplizieren. Sie sollten Ihre 'Token'-Erstellung als Teil des Serializers' save' durchführen, damit Sie nicht alle diese Geschäftslogik in der Ansicht haben und Kopieren von Code aus der Superklasse vermeiden. – John

Verwandte Themen