gpt4 book ai didi

django - has_object_permission 和 has_permission 之间有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 19:36:24 27 4
gpt4 key购买 nike

我对 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]

但它根本不起作用。每个人都可以通过权限并更新数据。

未打印调用的


我曾经定义过这个类: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有什么区别?

最佳答案

我们在 BasePermission 类上有以下两种权限方法:

  • def has_permission(self, request, view)
  • def has_object_permission(self, request, view, obj)

这两种不同的方法被要求限制未经授权的用户进行数据插入和操作。

has_permission 在所有 HTTP 请求上调用,而 has_object_permission 从 DRF 的方法 def get_object(self) 调用。因此,has_object_permission 方法可用于 GETPUTDELETE,不适用于 POST 请求。

总结:

  • permission_classes 在定义的列表上循环。
  • has_object_permission 方法在 has_permission 方法返回值 True 后调用,除了在 POST 方法中(仅在 POST 方法中has_permission 被执行)。
  • permission_classes 方法返回一个 False 值时,请求没有权限,不会再循环,否则,它会检查循环的所有权限。<
  • has_permission 方法将在所有 (GET, POST, PUT, DELETE) HTTP 请求。
  • has_object_permission 方法不会在 HTTP POST 请求中被调用,因此我们需要从 has_permission 方法中限制它。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com