当前位置: 首页 > 面试题库 >

Django Rest Framework ViewSet方法的Permission_classes

慕容齐智
2023-03-14
问题内容

我正在使用Django REST框架编写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)

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

在文档中,我看到了使用permission_classes装饰器保护API视图(而非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的标准输出已缓冲(这意味着它会将一些“写入”到标准输出的数据收集起来,然后再将其写入终端)。调用会强制其“刷新”缓冲区,这意味着它将把缓冲区中的所有内容都写到终端,即使通常情况下它会等待这样做。 以下是有关(非)缓冲I / O及其有用之处的一些良好信息: http : //en.wikipedia.org/wiki/Data_buffer 缓冲与无缓冲

  • 我对Java中泛型的概念不熟悉。我有一个泛型方法,它的返回类型也是泛型。 我收到此错误,< code >无法解析T中的方法“getAa”。两个类都有这个成员变量,但是java并不理解,因为sub方法返回的是这个对象的一般列表。有没有办法改掉这个错误? 下面是我的代码,

  • 问题内容: 我刚刚开始使用Java进行编程。在讨论方法和构造函数时,我们缺少使用的文字。我不确定到底是什么方法或构造函数以及什么使每个方法唯一。有人可以帮我定义它们并区分两者吗? 问题答案: 构造函数与方法之间的重要区别在于,构造函数初始化使用运算符创建的对象,而方法对已存在的对象执行操作。 构造函数不能直接调用。当关键字创建对象时,将隐式调用它们。可以直接在已使用创建的对象上调用方法。 构造函数

  • 本文向大家介绍Symfony2安装的方法(2种方法),包括了Symfony2安装的方法(2种方法)的使用技巧和注意事项,需要的朋友参考一下 本文详细讲述了Symfony2安装的方法。分享给大家供大家参考,具体如下: 一、Composer安装Symfony Composer安装Symfony方法在前面的文章《Symfony之十分钟入门》有介绍 二、Symfony Installer安装Symfony

  • 本文向大家介绍python的类方法和静态方法,包括了python的类方法和静态方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python的类方法和静态方法。分享给大家供大家参考。具体分析如下: python没有和C++中static关键字,它的静态方法是怎样的呢?还有其它语言中少有的类方法又是神马? python中实现静态方法和类方法都是依赖于python的修饰器来实现的。 大家注意

  • 上一个小节我们学习了 Python 的类属性和实例属性的知识点,这个小节我们还是会学习关于类的知识。这节课我们会学习类的构造方法、析构方法和实例方法。 1. 实例方法 1.1 定义 实例方法是用于访问对象实例属性的方法,语法如下: class 类: def 实例方法(self): self.属性 实例方法定义在类中,它的第一个参数 self 指向调用该方法的对象,在实例方

  • 本文向大家介绍HTML5 Blob.slice()方法的用法,包括了HTML5 Blob.slice()方法的用法的使用技巧和注意事项,需要的朋友参考一下 HTML5文件Blob.slice()方法对于创建包含数据的Blob对象很有用。此数据在源Blob的指定字节范围内。 让我们看一个使用来发送和接收二进制数据的示例。本示例发送文本,并使用POST方法将“文件”发送到服务器: