Освоение Django: ограничение ModelViewSet запросами POST

Привет, любители Django! Сегодня мы собираемся погрузиться в мир представлений Django и изучить, как ограничить ModelViewSet в вашем приложении Django, чтобы он принимал только запросы POST. Так что берите свой любимый напиток, садитесь поудобнее и начнем!

Если вы знакомы с Django, вы, вероятно, сталкивались с ModelViewSet. Это мощное представление на основе классов, которое обеспечивает функциональность CRUD для ваших моделей Django «из коробки». Однако по умолчанию он разрешает все методы HTTP, включая GET, POST, PUT, PATCH и DELETE. Но что, если вы хотите ограничить его приемом только POST-запросов? Что ж, не бойтесь, потому что мы предлагаем вам несколько разных подходов.

Подход 1: переопределение метода get_queryset

Первый подход предполагает переопределение метода get_querysetв подклассе ModelViewSet. По умолчанию этот метод возвращает набор запросов, с которым должно работать представление. Чтобы ограничить прием только запросов POST, вы можете вызвать исключение MethodNotAllowedдля всех остальных методов HTTP. Вот пример:

from rest_framework.exceptions import MethodNotAllowed
class MyModelViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    def get_queryset(self):
        if self.request.method != 'POST':
            raise MethodNotAllowed(self.request.method)
        return super().get_queryset()

Подход 2: использование декоратора

Другой подход — использовать декоратор, чтобы ограничить ModelViewSet приемом только запросов POST. Вы можете определить собственный декоратор, который проверяет метод HTTP и выдает исключение, если это не запрос POST. Вот пример:

from rest_framework.decorators import action
from rest_framework.exceptions import MethodNotAllowed
def post_only(view_func):
    def wrapped_view(*args, kwargs):
        if args[0].request.method != 'POST':
            raise MethodNotAllowed(args[0].request.method)
        return view_func(*args, kwargs)
    return wrapped_view
class MyModelViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    @action(detail=True, methods=['POST'])
    @post_only
    def custom_action(self, request, pk=None):
        # Custom action code goes here
        pass

Украшая метод custom_actionдекоратором @actionи нашим пользовательским декоратором post_only, мы гарантируем, что для этого конкретного запроса разрешены только POST-запросы. действие.

Подход 3: использование @list_routeи @detail_route

Django Rest Framework

Если вы используете более старую версию Django Rest Framework (DRF), которая не поддерживает декоратор @action, вы можете использовать @list_routeи @detail_routeвместо декораторов. Вот пример:

from rest_framework.decorators import list_route, detail_route
from rest_framework.exceptions import MethodNotAllowed
class MyModelViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    @list_route(methods=['POST'])
    def custom_action(self, request):
        if request.method != 'POST':
            raise MethodNotAllowed(request.method)
        # Custom action code goes here
        pass
    @detail_route(methods=['POST'])
    def another_custom_action(self, request, pk=None):
        if request.method != 'POST':
            raise MethodNotAllowed(request.method)
        # Another custom action code goes here
        pass

В этом подходе мы используем декораторы @list_routeи @detail_routeдля определения пользовательских действий для нашего ModelViewSet. Затем мы проверяем метод HTTP внутри каждого действия и возбуждаем исключение, если это не запрос POST.

Подведение итогов

Вот и все! Мы рассмотрели три различных метода, позволяющих ограничить ModelViewSet в Django приемом только POST-запросов. Предпочитаете ли вы переопределить метод get_queryset, использовать декораторы или использовать декораторы @list_routeи @detail_route, теперь у вас есть инструменты для управления разрешенными HTTP-протоколами. методы в ваших представлениях Django.

Помните, что прежде чем выбирать подход, который лучше всего соответствует вашим потребностям, важно учитывать структуру и требования вашего приложения. Приятного кодирования!