Django 管理员权限应用于 REST API 视图

sim*_*nes 1 django django-rest-framework

在 django 管理界面中,可以指定每个模型的权限。示例模型 Customer 的权限选项为:

  • 可以添加客户
  • 可以换客户
  • 可以删除客户
  • 可以查看客户

然而,这些权限似乎不适用于 REST Framework API 视图 ( rest_framework.viewsets.ModelViewSet),实现Customer如下:

class CustomerViewSet(viewsets.ModelViewSet):
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer

class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

我认为通过将 DEFAULT_PERMISSION_CLASSES 设置为 DjangoModelPermissions 这些权限将得到反映,但事实并非如此:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.DjangoModelPermissions',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
}
Run Code Online (Sandbox Code Playgroud)

管理中定义的权限是否应该在视图中也适用于这些设置,是否不应该,和/或有什么方法可以实现这种情况?这样做的好处是系统管理员可以轻松地在管理界面中定义组并根据其问题区域定制权限,因此能够以这种方式定义权限是非常理想的。我已经看到了许多其他实现权限的方法,但从我所看到的来看,它们需要对 python 中的视图定义进行大量自定义。

版本:

  • 姜戈2.2.9
  • djangorest框架3.11.0
  • djangorestframework-simplejwt 4.4.0

小智 5

对于检查组和权限的API视图,我们可以在views.py中使用DjangoModelPermission,如下所示。

from rest_framework.permissions import DjangoModelPermissions

class CustomerViewSet(viewsets.ModelViewSet):
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer
    permission_classes = (DjangoModelPermissions, )
Run Code Online (Sandbox Code Playgroud)

它限制 POST、PUT 和 DELETE 访问,但允许 GET 访问。也想限制一下

from rest_framework.permissions import DjangoModelPermissions

class CustomDjangoModelPermissions(DjangoModelPermissions):
    def __init__(self):
        self.perms_map['GET'] = ['%(app_label)s.view_%       (model_name)s']


class CustomerViewSet(viewsets.ModelViewSet):
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer
    permission_classes = (CustomDjangoModelPermissions, )
Run Code Online (Sandbox Code Playgroud)