2017-01-31 1 views
0

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, wenn obj.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 ein 404 Fehlercode.
  • PUT /users/me Rückgabe des folgenden JSON-Nachrichtentextes: {"detail":"Method \"PUT\" not allowed."} und 405 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?

+0

Was meinen Sie mit "Ich kann ../users/me" anrufen? Kannst du genauer sein ? – Linovia

+0

Wenn ich eine GET-Anfrage an diesen Endpunkt mache, erhalte ich eine Antwort von 200 mit dem entsprechenden JSON – NBajanca

Antwort

1

Es sieht so aus, als hätten Sie Konflikte in Ihren Routen.

^users/(?P<pk>[^/.]+)$ sollte fangen "/ Benutzer/mich" und daher wird es keine Chance haben, Ihre spezifische Sicht zu treffen.

Entweder setzen Sie die pk url kwargs regexp auf etwas spezifischer (wie Integer für ID) oder setzen Sie die DynamicListRoute vor den beiden anderen Route.

Verwandte Themen