如何仅在特定方法上添加 django rest 框架权限?

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

我在其余 API 中为用户模型提供了以下功能。我只想对 POST 请求设置 AllowAny 权限。谁能帮帮我。

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)

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

按照上述 URL 你必须写一个自定义权限 class

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

根据 POST 和 GET

在 MyCUstomAuthenticated 中使用 AllowAny 或 IsAuthenticated 编写您自己的逻辑

您可以编写一个 custom Permission class IsPostOrIsAuthenticated ,这将允许不受限制地访问 POST 请求,但只允许经过身份验证的 GET 请求。

要实现自定义权限 IsPostOrIsAuthenticated,请覆盖 BasePermission class 并实现 .has_permission(self, request, view) 方法。如果请求应该被授予访问权限,该方法应该 return 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 请求都将被授予不受限制的访问权限。对于其他请求,将需要身份验证。

现在,您需要在全局设置中包含此自定义权限 class。

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