3
votes

Comment définir correctement l'en-tête Allow pour un code d'état HTTP_405_METHOD_NOT_ALLOWED dans le framework Django REST

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:

 HTTP_405_METHOD_NOT_ALLOWED Exemple de Django Rest Framework

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 ...


0 commentaires

3 Réponses :


0
votes

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


0 commentaires

1
votes

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")


0 commentaires

0
votes

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.


0 commentaires