ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Отключение методов в Django REST ViewSet: детальное руководство

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы без промедления отключить какой-либо метод, например POST, во ViewSet Django REST Framework, его необходимо переопределить, вызвав при этом исключение MethodNotAllowed:

Python
Скопировать код
from rest_framework.exceptions import MethodNotAllowed

class MyViewSet(viewsets.ModelViewSet):
    # ...

    def create(self, request, *args, **kwargs):
        raise MethodNotAllowed('POST')

Если нужно отключить метод в зависимости от определенных условий или для специфических случаев, стоит применить декоратор @action:

Python
Скопировать код
from rest_framework.decorators import action

class MyViewSet(viewsets.ModelViewSet):
    # ...

    @action(methods=['get'], detail=False)
    def custom_method(self, request):
        pass

Использование атрибута methods=['get'] указывает на допустимость только GET-запросов.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Использование возможностей http_method_names

Если вам необходимо избежать индивидуального переопределения каждого метода, примените свойство http_method_names для указания разрешенных методов:

Python
Скопировать код
class MyViewSet(viewsets.ViewSet):
    http_method_names = ['get', 'head', 'options']

    # Исключаем использование методов POST, PUT и DELETE

Этот подход также позволяет отображать только поддерживаемые действия в браузерабельном API.

Реализуйте свои операции с помощью пользовательских миксинов

Создание собственных миксинов позволяет настраивать нужную комбинацию операций CRUD без использования всего ModelViewSet:

Python
Скопировать код
from rest_framework import mixins
from rest_framework import viewsets

class CustomViewSet(mixins.CreateModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
    # Код вашего view set

Такой подход дает вам гибкость в управлении данными.

Визуализация

Предположим, мы отключаем метод .destroy() во ViewSet фреймворка Django REST. Presenterм ViewSet можно как набор инструментов (🧰), где каждый инструмент – это отдельный метод:

Markdown
Скопировать код
        🧰 Изначальный набор: [🔨, 🪛, 🛠, 🗡]
        # 🔨 = .create(), 🪛 = .retrieve(), 🛠 = .update(), 🗡 = .destroy()

Теперь отключаем метод .destroy() из-за его возможной опасности:

Markdown
Скопировать код
        🧰 Измененный набор: [🔨, 🪛, 🛠]
        # 🔨 = .create(), 🪛 = .retrieve(), 🛠 = .update()
        
        🗡 = Метод отключен 🚫

Теперь у нас есть набор без опасных инструментов.

Используйте пользовательские роутеры для детального контроля

Создание собственных роутеров позволяет с точностью указывать, какие методы нужно запретить, прописывая это в конфигурации URL:

Python
Скопировать код
from rest_framework.routers import SimpleRouter

class CustomRouter(SimpleRouter):
    def get_method_map(self, viewset, method_map):
        method_map = super().get_method_map(viewset, method_map)
        method_map.pop('delete', None)
        return method_map

Таким образом вы точно определяете, какие операции доступны для вашего API.

Эффективно используйте возможности DRF 3.14.0

Рекомендуем обновить Django REST Framework до версии 3.14.0 для корректной обработки ошибок HTTP 405 Method Not Allowed. Ваши клиенты будут в курсе всех доступных возможностей API благодаря детализированному ответу от метода OPTIONS:

Python
Скопировать код
# Улучшенное управление ошибками 405 в DRF 3.14.0

Регулярное обновление Django REST Framework обеспечивает безопасность приложения и доступ к новым функциям.

Полезные материалы

  1. Viewsets – Django REST framework — о том, как отключать методы в ViewSets Django REST Framework.
  2. ViewSet -- Classy DRF — документация и примеры настройки ViewSet.
  3. Философия дизайна | Документация Django | Django — принципы работы с Django, включая рекомендации по обновлению.
  4. GitHub – encode/django-rest-framework: Web APIs для Django. 🎸 — официальный репозиторий Django REST Framework на GitHub.
  5. Material для MkDocs — полезный инструмент для создания документации, оптимизирован для работы с проектами с API на основе Django REST Framework.