基于 Django rest 框架中的 action/url 的权限

permission based on the action/url in Django rest framewrok

我有一个 Modelviewset class,其中有几个函数,如 list()、destroy、partial_update() 以及其他自定义函数,如 def get_examples(self,request)。问题是不同的功能根据用户类型具有不同的权限。我在权限文件中有单独的权限 class。现在我需要访问 has_permission 函数中的操作。我知道它可以在 modelviewset class 中的 get_permission 函数中完成。但是我们如何在 has_permission 函数中实现呢??

我的看法:

class ExampleView(viewsets.ModelViewSet):
    queryset = Example.objects.all().order_by("-created_at")
    serializer_class = ExampleSerializer
    
    pagination_class = ExampleNumberPagination
    
    def list(self, request, *args, **kwargs):        

    def partial_update(self, request, *args, **kwargs):        

    def custom_fuctin_1(self,request,*args,**kwargs):
    def custom_fuctin_2(self,request,*args,**kwargs):   

    def destroy(self, request, *args, **kwargs):

现在权限文件:

class ExampleClassPermission(BasePermission):

    def has_permission(self, request, view):

        user =request.user
        if request.method == 'GET' or request.method == 'POST':
            return True
        elif request.method == 'DELETE' and (user.role == 'manager' or user.role ==  'admin'):
            return True
        elif request.method == 'PUT':
            return True
        else:
            return False

在此权限class中,我想为视图class中的自定义function_1和2设置权限。我不能做 self.action == ''?就像在 get_permission.Can I??

您可以使用 view 参数访问操作:

class ExampleClassPermission(BasePermission):

    def has_permission(self, request, view):
       if view.action == 'list':
           # your code here