【问题标题】:Custom Permissions in Django Rest FrameworkDjango Rest Framework 中的自定义权限
【发布时间】:2020-09-16 11:58:26
【问题描述】:

我有这个获取视图,我想检查 IsOwner 权限。

权限类

class IsOwnerVendor(permissions.BasePermission):

def has_object_permission(self, request, view, obj):
    print(f"Vendor Email:{obj.vendor_id.email}")
    print(f"Loggon user:{obj.vendor_id.email}" )
    return obj.vendor_id.email == request.user

这是我的对象模型

class Menu(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=500)
    price = models.FloatField()
    quantity = models.IntegerField(default=1)
    menu_cat = models.CharField(choices=MENU_CAT, max_length=5)
    date_created = models.DateTimeField(auto_now_add=True)
    last_edited = models.DateTimeField(auto_now=True)
    vendor_id = models.ForeignKey(Vendor, on_delete=models.CASCADE)
    is_recurring = models.BooleanField(default=False)
    recurring_freq = models.IntegerField(default=1)

供应商模型

class Vendor(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True)
    business_name = models.CharField(max_length=100)
    email = models.EmailField()
    phone_number = PhoneField(help_text='Vendor phone number')
    registered_on = models.DateTimeField(auto_now_add=True)
    last_updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.business_name

这是我的观点

class MenuDetailView(generics.GenericAPIView):
    permission_classes = [IsOwnerVendor | IsOwnerVendor]

    def get_serializer_class(self):
        if self.request.method == 'PUT':
            return MenuUpdateSerializer
        elif self.request.method == 'GET':
            return MenuListSerializer
        else:
            return MenuListSerializer

    def get_object(self, pk):
        try:
            obj = Menu.objects.get(pk=pk, )
            self.check_object_permissions(self.request, obj)
            return obj
        except Menu.DoesNotExist:
            raise Http404

    @method_permission_classes((IsOwnerVendor,))
    def get(self, request, pk, format=None):
        my_menu = self.get_object(pk=pk)
        menu_serializer = MenuListSerializer(my_menu)
        return Response(menu_serializer.data, status=status.HTTP_200_OK)

当我尝试访问视图时,我总是收到以下错误

{
    "detail": "You do not have permission to perform this action."
}

我已阅读 DRF 文档,但仍无法确定问题所在。

我还在控制台上打印了权限检查器,发现它应该返回 true。

【问题讨论】:

  • 请发布模型供应商详细信息。
  • 试试return obj.vendor_id.email == request.user.email ?
  • @Ykh,我已编辑添加供应商模型。我也厌倦了你的方法。我仍然得到相同的结果。
  • 试试return obj.vendor_id.user == request.user
  • @Ykh,我刚刚使用 return obj.vendor_id.email == request.user.email 重试,现在它正在工作。我会打赌我试过了。我花了几个小时试图找出确切的问题。谢谢哥们。尊重。你能作为答案回复我接受吗?

标签: django django-rest-framework permissions


【解决方案1】:

重点是你应该让has_object_permission方法返回True,你可以试试:

return obj.vendor_id.email == request.user.emailreturn obj.vendor_id.user == request.user,如果还是不行,你可以打印log或者设置断点看看为什么这个方法返回False。下次测试前记得重启localserver。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-18
    • 2014-01-22
    • 2015-08-18
    • 2021-06-18
    • 2020-02-02
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多