我对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_permission
和has_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/