Как добавить разрешения Django Rest framework только для определенного метода?

У меня есть следующие функции в REST API для модели пользователя. Я хочу установить разрешение только по запросу при которой любой пост. Может кто-нибудь мне помочь.

class UserList(APIView):
    """Get and post users data."""

    def get(self, request, format=None):
        """Get users."""
        users = User.objects.all()
        serialized_users = UserSerializer(users, many=True)
        return Response(serialized_users.data)

    def post(self, request, format=None):
        """Post users."""
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)

2 ответов


вы можете написать пользовательский класс разрешений IsPostOrIsAuthenticated что позволит неограниченный доступ к POST запросы, но разрешат только аутентифицированные GET запросы.

для реализации пользовательского разрешения IsPostOrIsAuthenticated, переопределить BasePermission класс и реализовать .has_permission(self, request, view) метод. Метод должен возвращать True если запрос должен быть предоставлен доступ, и False иначе.

from rest_framework import permissions

class IsPostOrIsAuthenticated(permissions.BasePermission):        

    def has_permission(self, request, view):
        # allow all POST requests
        if request.method == 'POST':
            return True

        # Otherwise, only allow authenticated requests
        # Post Django 1.10, 'is_authenticated' is a read-only attribute
        return request.user and request.user.is_authenticated

так, все POST запросы будут неограниченный доступ. Для других запросов потребуется аутентификация.

теперь вам нужно включить этот пользовательский класс разрешений в глобальные настройки.

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'my_app.permissions.IsPostOrIsAuthenticated',
    )
}

http://www.django-rest-framework.org/api-guide/permissions/

согласно вышеуказанному URL вы должны написать один пользовательский класс разрешений

class ExampleView(APIView):
    permission_classes = (MyCUstomAuthenticated,)

напишите свою собственную логику, используя AllowAny или IsAuthenticated внутри MyCUstomAuthenticated на основе POST и GET