django rest framework - разрешить только определенные методы - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть ресурс, на котором я хочу разрешить клиенту только отправлять запрос на ресурс, поэтому я использую

class MyViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):

в моем наборе.

Когда я делаю почтовый запрос, он работает как положено.

Когда я делаю запрос списка, он выдает ответ 405, как и ожидалось.

Когда я делаю метод извлечения, установки, исправления или удаления, он выбрасывает 404 вместо 405 ... почему?

Как я могу сделать так, чтобы каждый запрос возвращал 405, несмотря на почтовый запрос?

спасибо и привет!

Ответы [ 3 ]

0 голосов
/ 04 ноября 2018

Использование http_method_names атрибут

class MyViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):
    <b>http_method_names = ['post']</b>
    # your code
0 голосов
/ 04 ноября 2018

Если у вашего viewset нет методов детализации, то drf SimpleRouter не создаст URL-маршрут для /api/basename/{id}/

Таким образом, диспетчер URL-адресов Django не будет соответствовать этим URL-адресам и возвращает 404.

Я не думаю, что имеет смысл возвращать 405 для каждого метода. Этот статус подразумевает, что по крайней мере один метод должен быть действительным для определенного URL.

Вы можете добавить метод фиктивной детализации, но просто передать все запросы обработчику APIView 405.

Я думаю, что это должно заставить маршрутизатор регистрировать подробные URL-адреса для набора и просто возвращать 405 для всего (возможно, за исключением OPTIONS).

class MyViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):

    def retrieve(self, request, *args, **kwargs):
        return self.http_method_not_allowed(request, *args, **kwargs)
0 голосов
/ 04 ноября 2018

Кажется, нет никакой причины использовать ViewSet, если вы хотите поддерживать только одно действие. Вместо этого используйте CreateApiView с указанием на него определенного URL.

...