【问题标题】:How to resolve error "object_permission() takes 3 positional arguments but 4 were given"?如何解决错误“object_permission() 需要 3 个位置参数但给出了 4 个”?
【发布时间】:2020-09-08 07:56:59
【问题描述】:

我正在尝试实现对象级权限。运行代码时,我收到一条错误消息,提示我使用了太多位置参数。

TypeError: has_object_permission() takes 3 positional arguments but 4 were given

但是,当我查看 Django Rest 框架的文档时,也使用了四个参数。

class PostOwnerPermssion(permissions.BasePermission):
    """
    Check if authenticated user is  story author
    """
    def has_object_permission(self,request,obj,**kwargs):
        if request.user.id == story.author:
            return True
        return False

我很高兴得到任何澄清。

谢谢。

【问题讨论】:

  • 不,那些是named参数:kwargs被命名了,所以name=value,如果你用obj.has_object_permission(foo, bar, qux)调用它就会出错。
  • 你能显示完整的回溯吗?
  • 向我们展示您拨打的电话给has_object_permission()

标签: python django django-rest-framework permissions


【解决方案1】:

但是,当我查看 Django Rest 框架的文档时, 还使用了四个参数。

class PostOwnerPermssion(permissions.BasePermission):
    """
    Check if authenticated user is  story author
    """
    def has_object_permission(self,request,obj,**kwargs):
        if request.user.id == story.author:
            return True
        return False

**kwargs 匹配任意数量的 named 参数,因此您可以使用 my_post_owner_permssion.has_object_permission(request, some_obj<b>, foo=bar, qux=bar2</b>)` 调用它,但 not 带有 位置 参数(没有名称的参数)。

您可以实现以下一种(或两种)方法:

  1. .has_permission(self, request, view);和
  2. .has_object_permission(self, request, view, obj)

在您的情况下缺少的是 view 参数,因此您可以将其重写为:

class PostOwnerPermssion(permissions.BasePermission):
    """
    Check if authenticated user is  story author
    """
    def has_object_permission(self, request, view, obj):
        return request.user.id == obj.author_id

【讨论】:

    【解决方案2】:

    (self,request,obj,**kwargs) 中有三个位置参数:self,request,obj

    您可以将其称为obj.has_object_permission(foo, bar)。请注意,**kwargs 是命名参数,因此您必须使用诸如 obj.has_object_permission(foo, bar, named_arg='something') 之类的名称来调用它。

    【讨论】:

      猜你喜欢
      • 2020-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 2019-12-12
      • 1970-01-01
      相关资源
      最近更新 更多