Was ich getan habe (in Betrieb)
ModelViewSet:DynamicListRoute mit benutzerdefinierten Router - Django Rastrahmen
class UserViewSet(viewsets.ModelViewSet):
"""
A viewset for viewing and editing user instances.
"""
permission_classes = [IsAuthenticated, IsUser]
serializer_class = UserSerializer
queryset = User.objects.all()
@list_route(methods=['GET','PUT'])
def me(self, request, *args, **kwargs):
self.kwargs.update(pk=request.user.id)
if request.method == 'GET':
return self.retrieve(request,*args, **kwargs)
else:
return self.update(request,*args, **kwargs)
Hinweise:
UserSerializer
ist ein einfaches ModelSerializer für einen Benutzer Objekt.IsUser
ist eine Berechtigungsklasse, die, wennobj.id == request.user.id
SimpleRouter prüft:
router = SimpleRouter(trailing_slash=False)
router.register(r'users', UserViewSet)
urlpatterns += router.urls
Hinweis:
- Der Pfad beginnt nicht hier, aber ich werde es übernehmen tut, um die Endpunkte zu benennen.
So, jetzt habe ich die in den SimpleRouter Documentation beschriebenen Routen bekommt, das im Grunde jeder herkömmlicher Endpunkt ist, zusätzlich:
- URL Stil:
users/me
- HTTP-Methode: GET und PUT (wie angegeben von
methods
Argument) - Aktion:
me
(@list_route
verziert Methode) - URL Name:
user-me
Meine Anträge
GET /users/me
ein JSON-codierte Benutzerobjekt zurück.PUT /users/me
Aktualisieren des Benutzerobjekts und Zurückgeben des aktualisierten JSON-codierten Benutzerobjekts.
Was ich will (nicht funktioniert)
brauche ich nicht, und wollen nicht alle von SimpleRouter
erstellt Routen.
Individuelle Router
class CustomRetrieveUpdateRouter(SimpleRouter):
routes = [
Route(
url=r'^{prefix}/{lookup}{trailing_slash}$',
mapping={'get': 'retrieve'},
name='{basename}-detail',
initkwargs={'suffix': 'Detail'}
),
Route(
url=r'^{prefix}/{lookup}{trailing_slash}$',
mapping={'put': 'update'},
name='{basename}-detail',
initkwargs={'suffix': 'Detail'}
),
DynamicListRoute(
url=r'^{prefix}/{methodname}{trailing_slash}$',
name='{basename}-{methodnamehyphen}',
initkwargs={}
)
]
Meine Anträge
GET /users/me
die folgende JSON Körper Rückkehr:{"detail":"Not found."}
und ein404
Fehlercode.PUT /users/me
Rückgabe des folgenden JSON-Nachrichtentextes:{"detail":"Method \"PUT\" not allowed."}
und405
Fehlercode.
Hinweis:
In Debug wenn ich eine Anfrage zu tun, die 404, die HTML-Seite zurückgibt zeigt die folgenden verfügbaren Endpunkte:
^users/(?P<pk>[^/.]+)$ [name='user-detail']
^users/(?P<pk>[^/.]+)$ [name='user-detail']
^users/me$ [name='user-me']
Was vergesse ich?
Was meinen Sie mit "Ich kann ../users/me" anrufen? Kannst du genauer sein ? – Linovia
Wenn ich eine GET-Anfrage an diesen Endpunkt mache, erhalte ich eine Antwort von 200 mit dem entsprechenden JSON – NBajanca