【问题标题】:Getting has_object_permission() missing 4 required positional arguments: 'self', 'request', 'view', and 'obj'获取 has_object_permission() 缺少 4 个必需的位置参数:“self”、“request”、“view”和“obj”
【发布时间】:2019-11-09 09:11:49
【问题描述】:

我正在尝试创建一个 has_object_permission 函数,该函数位于自定义类的 permissions.py 文件中:

class IsOwnerOrAdmin(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        print("has object permissions statement")
        return obj.owner == request.user

    def has_permission(self, request, view):
        print("has permissions statement")
        return request.user and request.user.is_authenticated

我的视图集如下所示:

class SchoolViewSet(viewsets.ModelViewSet):
    queryset = School.objects.all()
    serializer_class = SchoolSerializer
    permission_classes = [IsOwnerOrAdmin, 
        IsOwnerOrAdmin.has_object_permission()]
    ...

我在调用 /schools/ 端点时收到以下错误:

TypeError: has_object_permission() missing 4 required positional 
arguments: 'self', 'request', 'view', and 'obj'

但是,has_permissions 工作正常,我不必在我的 permission_classes 数组中显式调用它。它只是被调用。我如何传递这些论点?我这样做正确吗?我尝试了一些通过 self、通过 SchoolViewSet、通过obj=queryset 等的变体。不确定这是否正确。在互联网上找不到我需要解决此问题的确切内容。

更新 如何更改代码以调用 has_object_permission,就像自动调用 has_permission 一样?

【问题讨论】:

    标签: django-rest-framework permissions arguments


    【解决方案1】:

    permission_classes 定义不正确。它应该只包含自定义的类。

    class SchoolViewSet(viewsets.ModelViewSet):
        queryset = School.objects.all()
        serializer_class = SchoolSerializer
        permission_classes = [IsOwnerOrAdmin]
    

    【讨论】:

    • 不幸的是,has_object_permission 不会被这样调用。也许这个视图集不能调用 has_object_permission?
    猜你喜欢
    • 1970-01-01
    • 2020-02-15
    • 2021-12-15
    • 2023-02-06
    • 2021-09-15
    • 2013-07-06
    • 2022-01-05
    • 2017-03-28
    相关资源
    最近更新 更多