Search code examples
djangodjango-rest-frameworkdjango-permissions

How to add django rest framework permissions on specific method only ?


I have following functions in rest API for User model. I want to set AllowAny permission on only POST request. Can someone help me out.

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)

Solution

  • You can write a custom Permission class IsPostOrIsAuthenticated which will allow unrestricted access to POST requests but will allow only authenticated GET requests.

    To implement the custom permission IsPostOrIsAuthenticated, override the BasePermission class and implement .has_permission(self, request, view) method. The method should return True if the request should be granted access, and False otherwise.

    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
    

    So, all POST requests will be granted unrestricted access. For other requests, authentication will be required.

    Now, you need to include this custom permission class in your global settings.

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