ViewSets
ont des méthodes automatiques pour lister, récupérer, créer, mettre à jour, supprimer, ...
Je voudrais désactiver certains d'entre eux, et la solution que j'ai proposée n'est probablement pas la bonne, car les OPTIONS
indique toujours comme autorisés.
Une idée sur la manière de procéder de la bonne manière?
class SampleViewSet(viewsets.ModelViewSet):
queryset = api_models.Sample.objects.all()
serializer_class = api_serializers.SampleSerializer
def list(self, request):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
def create(self, request):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
UpdateModelMixin
. Si vous souhaitez utiliser la mise à jour mais pas le patch, je peux actuellement penser à deux façons. Vous pouvez soit remplacer les méthodes autorisées dans la vue et supprimer «patch», soit remplacer lapartial_update
méthode et appelerhttp_method_not_allowed(request, *args, **kwargs)
. Je n'ai pas testé cela, donc je ne suis pas sûr que cela fonctionneclass SampleViewSet(viewsets.ReadOnlyModelViewSet)
.Vous pouvez continuer à utiliser
viewsets.ModelViewSet
et à définirhttp_method_names
sur votre ViewSet.Exemple
Une fois que vous avez ajouté
http_method_names
, vous ne pourrez plus faireput
etpatch
plus.Si tu veux
put
mais ne veux paspatch
, tu peux garderhttp_method_names = ['get', 'post', 'head', 'put']
En interne, les vues DRF s'étendent de Django CBV. Django CBV a un attribut appelé http_method_names. Vous pouvez donc également utiliser http_method_names avec les vues DRF.
[Shameless Plug]: Si cette réponse vous a été utile, vous aimerez ma série d'articles sur DRF à l' adresse https://www.agiliq.com/blog/2019/04/drf-polls/ .
la source
python3
etDjango 1.10
très bien.mixins.UpdateModelMixin
Bien que cela fasse un moment pour cet article, j'ai soudainement découvert que c'était en fait un moyen de désactiver ces fonctions, vous pouvez le modifier directement dans le fichier views.py.
Source: https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions
la source
Si vous essayez de désactiver la méthode PUT à partir d'un ensemble de vues DRF, vous pouvez créer un routeur personnalisé:
En désactivant la méthode sur le routeur, la documentation de votre schéma d'API sera correcte.
la source
Comment désactiver la méthode "DELETE" pour ViewSet dans DRF
PS Ceci est plus fiable que de spécifier explicitement toutes les méthodes nécessaires, il y a donc moins de chance d'oublier certaines des méthodes importantes OPTIONS, HEAD, etc.
PPS par défaut DRF a
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
la source
super
au niveau de la classe, il n'y a pasself
.Dans Django Rest Framework 3.xx, vous pouvez simplement activer chaque méthode pour laquelle vous souhaitez activer
ModelViewSet
, en passant un dictionnaire àas_view
method. Dans ce dictionnaire, la clé doit contenir le type de requête (GET, POST, DELETE, etc.) et la valeur doit contenir le nom de la méthode correspondante (lister, récupérer, mettre à jour, etc.). Par exemple, disons que vous voulez que leSample
modèle soit créé ou lu mais que vous ne voulez pas qu'il soit modifié. Donc , cela signifie que vous voulezlist
,retrieve
et lacreate
méthode pour être permettre (et vous voulez que les autres sont désactivés.)Tout ce que vous avez à faire est d'ajouter des chemins pour
urlpatterns
aimer ceux-ci:Comme vous pouvez le voir il n'y a pas
delete
etput
demande au- dessus des paramètres de routage, donc par exemple si vous envoyez uneput
demande à l'URL, il vous réponse avec 405Method Not Allowed
:la source
Si vous prévoyez de désactiver les méthodes put / post / destroy, vous pouvez utiliser
la source