python - Django rest framework permission_classes of ViewSet 方法

标签 python django rest django-rest-framework

我正在使用 Django REST 框架编写一个休息 API,我想用权限保护某些端点。权限类看起来提供了一种优雅的方式来实现这一点。我的问题是我想对不同的重写 ViewSet 方法使用不同的权限类。

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def create(self, request, *args, **kwargs):
        return super(UserViewSet, self).create(request, *args, **kwargs)

    @decorators.permission_classes(permissions.IsAdminUser)
    def list(self, request, *args, **kwargs):
        return super(UserViewSet, self).list(request, *args, **kwargs)

在上面的代码中,我也想允许未经身份验证的用户注册(用户创建),但我不想让任何人列出用户,只是为了员工。

docs我看到了使用 permission_classes 装饰器保护 API View (不是 ViewSet 方法)的示例,并且我看到了为整个 ViewSet 设置权限类。但它似乎不适用于重写的 ViewSet 方法。有没有办法只将它们用于某些端点?

最佳答案

我认为没有内置的解决方案。但是您可以通过覆盖 get_permissions 方法来实现:

from rest_framework.permissions import AllowAny, IsAdminUser

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    permission_classes_by_action = {'create': [AllowAny],
                                    'list': [IsAdminUser]}

    def create(self, request, *args, **kwargs):
        return super(UserViewSet, self).create(request, *args, **kwargs)

    def list(self, request, *args, **kwargs):
        return super(UserViewSet, self).list(request, *args, **kwargs)

    def get_permissions(self):
        try:
            # return permission_classes depending on `action` 
            return [permission() for permission in self.permission_classes_by_action[self.action]]
        except KeyError: 
            # action is not set return default permission_classes
            return [permission() for permission in self.permission_classes]

关于python - Django rest framework permission_classes of ViewSet 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35970970/

相关文章:

python - 从 HTML 按钮单击执行 Python/Django 函数

html - 避免 Django 中表单输入元素 ID 重复

c# - 如何将asmx服务转换为rest以通过URL调用

java - 3.1.1 中的 SpringMVC Restful Service 无法运行(3.0.3 中运行正常)

Django Rest Framework 从外键关系返回单个字段

Java Rest方法返回结果但接收时出错 -Access-Control-Allow-Origin’缺失

python - 抓取 URL 和嵌套 CSV 以与 python 结合时出现问题

python - urllib2错误 'Not found on Accelerator'

python - tox、cython 和 fasttext

django - RelatedObjectDoesNotExist 异常