Как правильно установить заголовок «Разрешить» для кода состояния HTTP_405_METHOD_NOT_ALLOWED в среде REST Django - PullRequest
2 голосов
/ 24 марта 2019

В настоящее время я хочу отключить определенные методы для конечной точки API - в качестве дополнительной безопасности. Я использую код состояния, который DRF предлагает использовать, то есть для моего случая "HTTP_405_METHOD_NOT_ALLOWED" - однако, мне кажется, что, хотя это работает, заголовки все еще говорят, что метод в Разрешить. Смотрите скриншот ниже:

HTTP_405_METHOD_NOT_ALLOWED Django Rest Framework example

Как видите, я выполняю запрос GET - но заголовок Allow говорит, что он в порядке - даже если код состояния применяется правильно.

Пример кода без кода:

class TokenValidateView(APIView):
    def get(self, request, format=None):
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED, headers=?)

Полагаю, мне нужно было бы установить что-то в словаре заголовков (я добавил ?, где я не совсем уверен, что нужно сделать) в качестве одного из аргументов в функции Response (), но я я не уверен, что это ошибка в самом DRF? Конечно, когда этот код состояния передается, он должен быть установлен в заголовках соответственно?

N.B. Я также попытался добавить headers = { 'Allow': 'POST' } к аргументу Response(), но это не сработало ...

Ответы [ 3 ]

1 голос
/ 25 марта 2019

Поскольку вы используете класс APIView, он разрешит все методы, определенные в вашем классе представления.Ответ DRF разрешил метод HTTP GET, потому что вы определили его в своем представлении.


Класс просмотра ниже разрешит HTTP GET,HTTP POST,HTTP PATCH,HTTP PUT and HTTP DELETE

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

Как я уже говорил выше, класс ответа проверяет http методы внутри класса представления, , а не их ответы .

Итак, если вы хотите удалить метод HTTP GET из вашего Разрешенных методов , просто удалите get() метод из класса представления

class TokenValidateView(APIView):
    <b># remove the "get()" method</b>
    <b><strike>def get(self, request, format=None):</strike></b>
        <b><strike># something</strike></b>
        <b><strike>return Response("this is HTTP GET")</strike></b>

    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 голосов
/ 25 марта 2019

Если вам не нужен метод, просто не реализуйте его в представлении, которое является подклассом ApiView. Он автоматически отправит метод не разрешенный ответ.

0 голосов
/ 24 марта 2019

Когда вы переопределяете метод get представления, GET автоматически добавляется в заголовок Allow с помощью django-rest-framework, независимо от того, какой ответ вы возвращаете. Вы можете просто удалить метод get, если хотите, чтобы он возвращал 405 Not Allowed.

Если по какой-либо причине вы хотите сохранить метод get и не включать GET в заголовок Allow, вы можете переопределить свойство allowed_methods в своем представлении:

@property
def allowed_methods(self):
    allowed_methods = super().allowed_methods
    allowed_methods.remove('GET')
    return allowed_methods
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...