【问题标题】:How to add custom permission in viewset如何在视图集中添加自定义权限
【发布时间】:2018-01-29 07:41:11
【问题描述】:

在创建模块时如何在django rest框架的视图集中添加自定义权限而不是默认权限? 我有“fix_an_appointment”权限。在下面的视图集中,如何包含此权限?拥有此权限的人只能创建。

我的views.py文件:

class settingsViewSet(viewsets.ModelViewSet):
    serializer_class = SettingsSerializer
    queryset = Setting.objects.all()

谁能帮忙?

【问题讨论】:

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


【解决方案1】:

我不能在 ViewSet 中的额外操作中使用像 @permission_classes(IsAuthenticated, ) 这样的装饰器

要在操作中使用不同的权限,请将其作为参数放入@action()

@action(detail=True, methods=['post'], permission_classes=[IsAdminOrIsSelf])
    def set_password(self, request, pk=None):
       ...

drf doc

【讨论】:

    【解决方案2】:

    只需创建一个custom permission class

    class FixAnAppointmentPermssion(permissions.BasePermission):
        def has_permission(self, request, view):
            return True or False
    

    然后在您的视图集类中使用您的自定义权限

    class settingsViewSet(viewsets.ModelViewSet):
        serializer_class = SettingsSerializer
        queryset = Setting.objects.all()
        permission_classes = (FixAnAppointmentPermssion,)
    

    【讨论】:

      【解决方案3】:

      文档custom-permissions,查看操作列表actions my_permissions.py

      from rest_framework import permissions
      
      class FixPermission(permissions.BasePermission):
          """
          fix_an_appointment
          """
      
          def has_permission(self, request, view):
              if request.user.is_authenticated :
                  if view.action == 'retrieve':
                      return request.user.has_perms('fix_list_perm')
                  if view.action == 'retrieve':
                      return request.user.has_perms('fix_an_appointment')
              return False
      

      在views.py中

      from my_permissions import FixPermission
      
      
      class settingsViewSet(viewsets.ModelViewSet):
          serializer_class = SettingsSerializer
          queryset = Setting.objects.all()
          permission_classes = (FixPermission,)
      

      【讨论】:

      • 感谢您的回复。我想为每个操作添加、编辑、删除和更新单独添加自定义权限。该怎么做?
      • 带有操作视图的编辑答案,链接中所有操作的更多详细信息
      • @BearBrown 也许您打算将permission_classes 属性定义为一个列表?喜欢:permission_classes = [FixPermission]?如果不是这会引发以下错误:TypeError: 'BasePermissionMetaclass' object is not iterable
      • @railomaya 你可能想念逗号,(1, ) 是一个元组 (1) 是一个 int
      【解决方案4】:

      我们可以为创建、检索、更新、删除(添加、编辑、删除和更新)等每个功能设置权限

      from my_permissions import FixPermission
      
      class FixAnAppointmentPermssion(permissions.BasePermission):
          def has_permission(self, request, view):
             return True or False
      
      class YourViewSet(viewsets.ModelViewSet):
      serializer_class = SettingsSerializer
      queryset = Your.objects.all()
      
      @permission_classes(FixAnAppointmentPermssion,)
      def create(request, format=None):
        content = {
                 'status': 'request was permitted'
        }
      return Response(content)
      
      @permission_classes(FixAnAppointmentPermssion,)
      def retrive(request, format=None):
        content = {
                 'status': 'request was permitted'
        }
      return Response(content)
      

      【讨论】:

      • 这在我们使用ViewSet 时不起作用。即使您使用基于类的视图(CBV),我也怀疑这是否会起作用。我无法在 DRF 文档中直接提到将 @permission_classes 装饰器与 CBV 或 ViewSet 结合使用。我亲自用 ViewSet 测试了它,它只是忽略了权限类。但是,设置采用自定义权限类列表的类的 permission_classes 属性确实有效。
      猜你喜欢
      • 2014-03-25
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多