Je cherche actuellement à désactiver certaines méthodes pour un point de terminaison d'API - comme sécurité supplémentaire. J'utilise le code d'état que DRF suggère d'utiliser, c'est-à-dire pour mon cas, " HTTP_405_METHOD_NOT_ALLOWED
" - cependant, il me semble que même si cela fonctionne, les en-têtes indiquent toujours que la méthode est dans Autoriser. Voir la capture d'écran ci-dessous:
Comme vous pouvez le voir, j'effectue une requête GET - mais l'en-tête Allow indique que c'est bien - même si le code d'état est appliqué correctement.
Exemple de code supprimé:
class TokenValidateView(APIView): def get(self, request, format=None): return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED, headers=?)
Je crois que j'aurais besoin de définir quelque chose dans le dictionnaire des en-têtes (je ' avez ajouté ?
où je ne suis pas tout à fait sûr de ce qui doit être fait) comme l'un des arguments de la fonction Response (), mais je ne suis pas sûr s'il s'agit d'un bogue dans DRF lui-même? Lorsque ce code d'état est passé, il doit être défini en conséquence dans les en-têtes?
N.B. J'ai également essayé d'ajouter headers = {'Allow': 'POST'}
à l'argument Response ()
, mais cela ne semble pas fonctionner ...
3 Réponses :
Lorsque vous remplacez la méthode get
de la vue, GET
est automatiquement ajouté à l'en-tête Allow
par django-rest-framework, non importe quelle réponse vous retournez. Vous pouvez simplement supprimer la méthode get
si vous souhaitez qu'elle renvoie 405 Not Allowed
.
Si pour une raison, vous souhaitez conserver get
et n'incluez pas GET
dans l'en-tête Allow
, vous pouvez remplacer la propriété allowed_methods
dans votre vue:
@property def allowed_methods(self): allowed_methods = super().allowed_methods allowed_methods.remove('GET') return allowed_methods
Puisque vous utilisez la classe APIView
, elle autorisera toutes les méthodes qui sont définies dans votre classe de vue. La réponse DRF a autorisé la méthode HTTP GET
, car vous l'avez définie dans votre vue.
La classe de vue ci-dessous autorise HTTP GET, HTTP POST, HTTP PATCH, HTTP PUT et HTTP DELETE
class TokenValidateView(APIView): # remove the "get()" method def get(self, request, format=None): # something return Response("this is HTTP GET") def post(self, request, format=None): return Response("this is HTTP POST") def patch(self, request, format=None): return Response("this is HTTP PATCH") def put(self, request, format=None): return Response("this is HTTP PUT") def delete(self, request, format=None): return Response("this is HTTP DELETE")
Comme je l'ai dit ci-dessus, la classe de réponse vérifie le méthodes http dans la classe de vue, pas leurs réponses .
Par conséquent, si vous souhaitez supprimer la méthode HTTP GET
de vos Méthodes autorisées , supprimez simplement le get()
méthode de la classe de vue
class TokenValidateView(APIView): def get(self, request, format=None): # something return Response("this is HTTP GET") def post(self, request, format=None): return Response("this is HTTP POST") def patch(self, request, format=None): return Response("this is HTTP PATCH") def put(self, request, format=None): return Response("this is HTTP PUT") def delete(self, request, format=None): return Response("this is HTTP DELETE")
Si vous n'avez pas besoin de la méthode, ne l'implémentez pas sur la vue qui sous-classe ApiView. Il enverra automatiquement la réponse à la méthode non autorisée.