Django RESTE du cadre: méthode de METTRE pas autorisés dans ViewSet avec def update()
Dans DRF, j'ai une simple ViewSet comme celui-ci:
class MyViewSet(viewsets.ViewSet):
def update(self, request):
# do things...
return Response(status=status.HTTP_200_OK)
Lorsque je tente une demande, j'obtiens une erreur comme méthode de METTRE pas autorisés. Si j'utilise def put(self, request):
toutes les choses fonctionnent bien. En conséquence de les docs que je devrais utiliser def update():
pas def put():
, pourquoi est-il arrivé?
OriginalL'auteur floatingpurr | 2015-08-07
Vous devez vous connecter pour publier un commentaire.
C'est parce que le
APIView
n'a aucun gestionnaire de défini pour.put()
méthode de sorte que la demande entrante ne peut être mappé à une méthode de gestionnaire sur la vue, ce qui soulève une exception.(Note:
viewsets.ViewSet
hériter deViewSetMixin
etAPIView
)La
dispatch()
méthode dans leAPIView
vérifie si un gestionnaire de méthode est définie pour la demandemethod
.Si ledispatch()
méthode recherche un gestionnaire pour la méthode de demande, il renvoie la réponse appropriée. Sinon, il soulève une exceptionMethodNotAllowed
.Comme par le code source de
dispatch()
méthode dans leAPIView
classe:Depuis
.put()
gestionnaire de méthode n'est pas définie dans votre point de vue, la FONDATION des appels de secours gestionnaire.http_method_not_allowed
. Cela soulève uneMethodNotAllowed
exception.Le code source pour
.http_method_not_allowed()
est:Pourquoi il a travaillé lors de la définition
.put()
à votre avis?Lorsque vous avez défini
def put(self, request):
de votre point de vue, la FONDATION pourrait correspondre à la demande entrante méthode à une méthode de gestionnaire de la vue. Cela a conduit à la réponse appropriée étant retourné sans exception.Avez-vous défini un
router
dans vos urls lors de la définition deupdate()
à votre avis?J'ai défini un routeur pour enregistrer le viewSet
Cette méthode devrait fonctionner toujours. Veuillez vérifier si vous avez défini
viewsets
etrouters
correctement comme indiqué dans la documentation comme lerouter
lui-même définir leput
fonction de point à laupdate
fonction. Ainsi, lorsqu'unPUT
demande, gestionnaire d'exécuter le code pour.update()
action.L'URL que vous appelez contiennent le détail 'pk' paramètre de chemin? Cause d'appel MIS à la racine de la ressource, par exemple /users/ sans /utilisateurs/<pk> le résultat sera une méthode non autorisée.
OriginalL'auteur Rahul Gupta
Parfois c'est différent pour le POST et de le METTRE, parce que METTRE utilise l'id dans l'URL
Dans ce cas, le glissement annuel obtiendrez ce message d'erreur: "n'est pas Autorisé".
Exemple:
/api/users/
/api/users/1/
Espère qu'il va sauver beaucoup de temps pour quelqu'un
put
(au lieu deupdate
par la DRF mixin) ensuite, il sera sans ID.Sûr, mais pas tout le temps; imaginer un "singleton" de ressources, il n'y aura pas d'ID. Une utilisation de ce peut-être si vous avez un
/user/me
extrémité représentant l'utilisateur actuellement connecté.OriginalL'auteur yestema
S'apparente à la "Méthode de METTRE pas autorisé" problème avec ce code, parce que les " id " est absent de la demande:
S'est avéré que j'ai manqué 'id' dans le sérialiseur les champs de METTRE de la demande n'a PAS été en mesure de fournir un id pour l'enregistrement. La version fixe du sérialiseur est ci-dessous:
OriginalL'auteur Kostyantyn
Cette réponse est juste, Django RESTE du cadre: méthode de METTRE pas autorisés dans ViewSet avec def update(), n'est pas autorisé, parce que la DRF attend l'id d'instance pour être dans l'URL. Cela étant dit, l'utilisation de ce mixin dans votre ViewSet est probablement le meilleur moyen pour résoudre ce problème (à partir de https://gist.github.com/tomchristie/a2ace4577eff2c603b1b copier collé ci-dessous)
OriginalL'auteur felix