Contrôle des méthodes de requête dans django-rest-framework

introduction

Un mémo sur la méthode de contrôle de la méthode de requête lors de la construction d'une API à l'aide de django-rest-framework

environnement

Mac 10.15.5 Python 3.8.1 Django 3.0.7 djangorestframework 3.11.0

code

J'ai fait référence au code dans cet article

Contrôlé par les classes héritées

L'autorisation de la méthode de requête est contrôlée par la classe de base héritée par la classe définie dans views.py. Les vuesets.ModelViewSet font partie du code ci-dessous. Il est préparé par le rest_framework importé.

blog/views.py


import django_filters
from rest_framework import viewsets
from rest_framework import filters

from .models import User
from .models import Entry
from .serializer import UserSerializer
from .serializer import EntrySerializer


class UserViewSet(viewsets.ModelViewSet): # <-cette
    queryset = User.objects.all()
    serializer_class = UserSerializer


class EntryViewSet(viewsets.ModelViewSet): # <-cette
    queryset = Entry.objects.all()
    serializer_class = EntrySerializer
    filter_fields = ('author', 'status')

Contenu des ensembles de vues.ModelViewSet

Il est défini dans un fichier appelé viewssets.py dans rest_framework. Si vous héritez de ModelViewSet, vous pouvez utiliser GET, POST, PUT et DELETE, et si vous modifiez la classe héritée en ReadOnlyModelViewSet, vous ne pouvez contrôler que GET.

GET, POST, PUT, DELETE disponible

rest_framework/viewsets.py


class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):
    """
    A viewset that provides default `create()`, `retrieve()`, `update()`,
    `partial_update()`, `destroy()` and `list()` actions.
    """
    pass

Uniquement disponible pour GET

rest_framework/viewsets.py


class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
                           mixins.ListModelMixin,
                           GenericViewSet):
    """
    A viewset that provides default `list()` and `retrieve()` actions.
    """
    pass

Spécification des ressources lors de l'utilisation de PUT et DELETE

Lorsque vous utilisez PUT ou DELETE, il est nécessaire de spécifier jusqu'à la clé primaire. /api/users/ -> /api/users/1/

Pas bien


$ curl -X PUT -d name=yamada -d [email protected] localhost:8000/api/users/

OK


$ curl -X PUT -d name=yamada -d [email protected] localhost:8000/api/users/1/

En effet, DjangoRestFramework a besoin de savoir quels objets mettre à jour / supprimer. Il ne peut pas être reconnu dans la vue liste (/ api / users /). Je pense que vous obtiendrez une erreur comme celle-ci.

{"detail":"Method \"DELETE\" not allowed."}

{"detail":"Méthode\"DELETE\"N'est pas autorisé."}

référence

https://www.django-rest-framework.org/api-guide/viewsets/

https://stackoverflow.com/questions/26711975/django-drf-405-method-not-allowed-on-delete-operation/26714561#26714561

Recommended Posts

Contrôle des méthodes de requête dans django-rest-framework
Requête HTTP en Python
Méthodes d'objet chaîne en Python
Méthodes disponibles dans la liste
Méthodes disponibles dans le type d'ensemble
Appeler dynamiquement des méthodes en Python
Définir dynamiquement des fonctions (méthodes) en Python
Obtenir un booléen avec une requête Flask