【问题标题】:How to write permissions in a viewset with conditional statements in DRF?如何在 DRF 中使用条件语句在视图集中写入权限?
【发布时间】:2023-01-23 16:37:50
【问题描述】:

我有一个用 DRF 编写的视图集:

class MyViewSet(ModelViewSet):
    serializer_class = MySerializer
    queryset = models.MyClass.objects.all()

    def get_serializer_class(self):
        permission = self.request.user.permission
        if permission=='owner' or permission=='admin': 
            return self.serializer_class
        else:
            return OtherSerializer

    def perform_create(self, serializer):
        permission = self.request.user.permission
        if permission=='owner' or permission=='admin': 
            serializer.save() 

        else:
            employee = models.Employee.objects.get(user=self.request.user)
            serializer.save(employee=employee)

在这里,我在 get_serializer_class 和 perform_create 中都使用了以下语句,看起来像是重复代码:

permission = self.request.user.permission
        if permission=='owner' or permission=='admin': 

有没有办法写一次然后以某种方式将它用作 permission_class ?

【问题讨论】:

    标签: python django django-rest-framework django-views django-permissions


    【解决方案1】:

    创建自定义权限类 https://www.django-rest-framework.org/api-guide/permissions/#custom-permissions

    from rest_framework.permissions import BasePermission, SAFE_METHODS
        class CustomPermission(BasePermission):
            def has_permission(self, request, view):
                if request.method in SAFE_METHODS:
                    return True
                permission = self.request.user.permission
                if permission=='owner' or permission=='admin': 
                    return True
                return False 
    

    在 Views.py 中

    class MyViewSet(ModelViewSet):
        serializer_class = MySerializer
        queryset = models.MyClass.objects.all()
        permission_classes = (CustomPermission,)
    

    【讨论】:

      猜你喜欢
      • 2015-12-10
      • 1970-01-01
      • 2023-01-22
      • 2018-12-17
      • 2016-08-01
      • 2018-10-19
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多