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
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)' –
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