Установка различных классов разрешений для POST и GET при использовании маршрутизатора по умолчанию в djangorestframework - PullRequest
1 голос
/ 17 января 2020

Я просто смотрел онлайн-учебник о том, как использовать Django Rest Framework для создания базового c REST API с использованием их маршрутизатора по умолчанию. Ссылка на Документы

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

Мне было интересно, есть ли способ дать им разные классы allow__class в зависимости от типа запроса.

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Да, вы можете написать свои собственные разрешения. Просто создайте какой-нибудь python файл. Я назвал его permissions.py:

from rest_framework.generics import get_object_or_404
from rest_framework.permissions import BasePermission
from company.models import Company


class IsGetOrIsAuthenticated(BasePermission):
    def has_permission(self, request, view):
        if request.method == 'GET':
            return True
        return request.user and request.user.is_authenticated


class IsGetOrIsCompanyOwner(BasePermission):
    def has_permission(self, request, view):
        if request.method == 'GET' or 'OPTIONS':
            return True
        elif request.method == 'DELETE':
            company = get_object_or_404(Company, id=view.kwargs['pk'])
            return request.user.user_type == 'moder' or company.owner == request.user
        else:
            company = get_object_or_404(Company, id=view.kwargs['pk'])
            return company.owner == request.user or request.user.user_type == 'moder'


class IsModer(BasePermission):
    def has_permission(self, request, view):
        return request.user.user_type == 'moder'

После этого вы можете использовать их в views.py

from company.permissions import IsGetOrIsAuthenticated, IsGetOrIsCompanyOwner, IsModer

class ActiveCompanyShortView(ModelViewSet):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsGetOrIsAuthenticated,)

, вы можете прочитать больше там

1 голос
/ 17 января 2020

Чтобы достичь того, что вам нужно, одним из возможных решений является переопределение get_permissions() из ViewSet.

def get_permissions(self):
        """
        Instantiates and returns the list of permissions that this view requires.
        """
        if self.action == 'list':
            return [objects of permissions_u_need_in_list_view]

        elif self.action == 'create':
            return [objects of permissions_u_need_in_create_view]

Это то, что в DRF дает определение get_permissions().

def get_permissions(self):
        """
        Instantiates and returns the list of permissions that this view requires.
        """
        return [permission() for permission in self.permission_classes]
...