Отключение методов в Django REST ViewSet: детальное руководство
Быстрый ответ
Чтобы без промедления отключить какой-либо метод, например POST
, во ViewSet Django REST Framework, его необходимо переопределить, вызвав при этом исключение MethodNotAllowed
:
from rest_framework.exceptions import MethodNotAllowed
class MyViewSet(viewsets.ModelViewSet):
# ...
def create(self, request, *args, **kwargs):
raise MethodNotAllowed('POST')
Если нужно отключить метод в зависимости от определенных условий или для специфических случаев, стоит применить декоратор @action
:
from rest_framework.decorators import action
class MyViewSet(viewsets.ModelViewSet):
# ...
@action(methods=['get'], detail=False)
def custom_method(self, request):
pass
Использование атрибута methods=['get']
указывает на допустимость только GET-запросов.
Использование возможностей http_method_names
Если вам необходимо избежать индивидуального переопределения каждого метода, примените свойство http_method_names
для указания разрешенных методов:
class MyViewSet(viewsets.ViewSet):
http_method_names = ['get', 'head', 'options']
# Исключаем использование методов POST, PUT и DELETE
Этот подход также позволяет отображать только поддерживаемые действия в браузерабельном API.
Реализуйте свои операции с помощью пользовательских миксинов
Создание собственных миксинов позволяет настраивать нужную комбинацию операций CRUD без использования всего ModelViewSet
:
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 можно как набор инструментов (🧰), где каждый инструмент – это отдельный метод:
🧰 Изначальный набор: [🔨, 🪛, 🛠, 🗡]
# 🔨 = .create(), 🪛 = .retrieve(), 🛠 = .update(), 🗡 = .destroy()
Теперь отключаем метод .destroy()
из-за его возможной опасности:
🧰 Измененный набор: [🔨, 🪛, 🛠]
# 🔨 = .create(), 🪛 = .retrieve(), 🛠 = .update()
🗡 = Метод отключен 🚫
Теперь у нас есть набор без опасных инструментов.
Используйте пользовательские роутеры для детального контроля
Создание собственных роутеров позволяет с точностью указывать, какие методы нужно запретить, прописывая это в конфигурации URL:
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
:
# Улучшенное управление ошибками 405 в DRF 3.14.0
Регулярное обновление Django REST Framework обеспечивает безопасность приложения и доступ к новым функциям.
Полезные материалы
- Viewsets – Django REST framework — о том, как отключать методы в ViewSets Django REST Framework.
- ViewSet -- Classy DRF — документация и примеры настройки ViewSet.
- Философия дизайна | Документация Django | Django — принципы работы с Django, включая рекомендации по обновлению.
- GitHub – encode/django-rest-framework: Web APIs для Django. 🎸 — официальный репозиторий Django REST Framework на GitHub.
- Material для MkDocs — полезный инструмент для создания документации, оптимизирован для работы с проектами с API на основе Django REST Framework.