首页 > 解决方案 > 是否可以检查函数是否具有来自 DRF 和 Django 中的类属性的装饰器?

问题描述

我目前正在考虑如何使用 DRF 在我的 Django 应用程序中实现权限。我的想法是有几个通用类继承BasePermission并在视图中定义这些类,例如:

class ExampleView(ModelViewSet):
   permission_classes = (ExamplePermissionClass,)

但是,这对于我拥有的某些视图可能不够,即我可能会在整个视图上声明一个通用类,但我可能还希望一个@action使用不同的权限。为此,我想制作装饰器权限,它会根据每个方法检查权限。但是,我确实认为这permission_classes是先执行的,这是行不通的。有办法解决这个问题吗?

例子:

class ExampleView(ModelViewSet):
   permission_classes = (ExamplePermissionClass,)
   
   @permissions(PermissionName etc...)
   @action(...)
   def example_action

我怎样才能绕过权限类,只在这里检查装饰器?

标签: djangodjango-rest-framework

解决方案


您可以使用get_permissions方法为不同的操作配置不同的权限:

def get_permissions(self):
    if self.action == "example_action":
        return (ExamplePermissionClass1, ExamplePermissionClass2)
    else:
        return self.permission_classes   # Default value
   

查看文档的部分以获取更多信息。


推荐阅读