我对Django-rest-framework中的BasePermission感到困惑。

在这里,我定义了一个类:IsAuthenticatedAndOwner

class IsAuthenticatedAndOwner(BasePermission):
    message = 'You must be the owner of this object.'
    def has_permission(self, request, view):
        print('called')
        return False
    def has_object_permission(self, request, view, obj):
        # return obj.user == request.user
        return False

views.py中使用
class StudentUpdateAPIView(RetrieveUpdateAPIView):
    serializer_class = StudentCreateUpdateSerializer
    queryset = Student.objects.all()
    lookup_field = 'pk'
    permissions_classes = [IsAuthenticatedAndOwner]

但这根本不起作用,每个人都可以通过权限并更新数据。
未打印called

我以前定义了这个类:IsNotAuthenticated
class IsNotAuthenticated(BasePermission):
    message = 'You are already logged in.'
    def has_permission(self, request, view):
        return not request.user.is_authenticated()

在功能上很好用
class UserCreateAPIView(CreateAPIView):
    serializer_class = UserCreateSerializer
    queryset = User.objects.all()
    permission_classes = [IsNotAuthenticated]

那么,上面的示例与has_object_permissionhas_permission函数有什么区别?

最佳答案

基本上,第一个代码拒绝所有内容,因为has_permission返回False。
has_permission是在调用has_object_permission之前进行的检查。这意味着,在有机会检查所有权测试之前,必须先获得has_permission的允许。

您想要的是:

class IsAuthenticatedAndOwner(BasePermission):
    message = 'You must be the owner of this object.'
    def has_permission(self, request, view):
        return request.user and request.user.is_authenticated
    def has_object_permission(self, request, view, obj):
        return obj.user == request.user

这还将允许经过身份验证的用户创建新项目或列出它们。

关于python - DRF :Permission?中has_object_permission和has_permission有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43064417/

10-12 21:15