django rest framework - mit detail_route und detail_list
In meinem code habe ich ein viewset für den Benutzer.
Ich will damit nur Lese-Operationen (/users/42 und /users/), die die ReadOnlyModelViewSet einfach gut tut.
Darüber hinaus möchte ich eine /users/register URL, die kann ich POST in, um sich zu registrieren einen neuen Benutzer.
class UserViewSet(viewsets.ReadOnlyModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
@list_route(methods=['post'])
def register(request):
serializer = UserSerializer(data=request.DATA)
if serializer.is_valid():
user = User.objects.create_user(
username = serializer.init_data['username'],
password = serializer.init_data['password'],
)
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Paar Fragen:
-
Wäre das dies der richtige Weg, das zu tun?
-
Gibt es eine bestimmte Signatur für eine Methode, wenn ich Sie in eine list_route oder die detail_route decorator? denn in der detail_route Beispiele es ist immer die gleiche Signatur für die Methode: method_name(self, request, pk=None):
Dank!
InformationsquelleAutor Ofek Agmon | 2015-05-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein code ist fast richtig, du bist nur fehlt die richtige Unterschrift auf die register-Methode:
Dies ist der richtige Signatur nach die Dokumentation. Zusätzlich die tests behaupten, dass es nicht möglich ist, übergeben Sie einen zusätzlichen parameter für das routing und die pk wird immer übergeben werden, die für eine
@detail_route
, so müsste man haben:zum detail Routen und
Liste Routen.
Aber ich würde vorschlagen, Sie nutzen die eingebaute ViewSetMixins als ModelViewSet nicht intern:
Für die Benutzer-Anmeldung im Allgemeinen, Sie können auch nehmen einen Blick auf django-registration-restframework die ich derzeit Arbeit für mein Projekt.
Persönlich verlasse ich mich auf die ModelViewSet in meinen Projekten und stellen sicher, dass nur ordnungsgemäß autorisierte Benutzer können bestimmte Aktionen durchführen. Dazu kann man die Modell-Breite Berechtigungen oder in Kombination mit django-guardian Objektspezifische Berechtigungen.
Insbesondere mit einer REST-API wirst du irgendwann an den Punkt kommen, möchten Sie bestimmten Benutzern das ausführen von Aktionen nur auf bestimmte Objekte, ohne zu müssen micromanage jede Anfrage. Object-level Berechtigungen von großem nutzen sein kann hier.
Du hast absolut Recht. Ich veränderte den code, um die richtige Mixins in Verbindung explizit, anstelle von monkey-patching den code ändern aus.
Ich konnte nicht finden, dass jedes Stück der Dokumentation detail/link_route neben hier, weil es veraltet ist. Danke!!!
InformationsquelleAutor Sebastian Wozny
detail_route und detail_list erhalten veraltet auf DRF 3.0 verwenden Sie stattdessen @action:
Detail verwenden=True bei dieser Methode wird der account für eine einzelne Instanz des Modells, repräsentiert durch, die endpoint -, und False, wenn es Bedürfnisse zu vertreten, ein Queryset dieses Modell
InformationsquelleAutor Gregory