zoukankan      html  css  js  c++  java
  • drf 权限流程解析

    权限

    设置权限,permission_classes

    简单使用

    from rest_framework.permissions import BasePermission
    from rest_framework import exceptions
    
    class MyPermission(BasePermission):
        message = {'code': 10001, 'error': '你没权限'}
        def has_permission(self, request, view):
            """
            # 用于多条数据的
            Return `True` if permission is granted, `False` otherwise.
            """
            if request.user:
                return True
    
            # raise exceptions.PermissionDenied({'code': 10001, 'error': '你没权限'})
            return False
    
        def has_object_permission(self, request, view, obj):
            """
            # 用于只有单条数据的
            Return `True` if permission is granted, `False` otherwise.
            """
            return False
    

    视图:

    class OrderView(APIView):
        permission_classes = [MyPermission,]
        def get(self,request,*args,**kwargs):
            return Response('order')
    
    
    class UserView(APIView):
        permission_classes = [MyPermission, ]
        def get(self,request,*args,**kwargs):
            return Response('user')
    
    

    源码:

    class APIView(View):
        permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
        
        def dispatch(self, request, *args, **kwargs):
            封装request对象
            self.initial(request, *args, **kwargs)
            通过反射执行视图中的方法
    
            
    	def initial(self, request, *args, **kwargs):
            版本的处理
            # 认证
            self.perform_authentication(request)
    		
            # 权限判断
            self.check_permissions(request)  
            
            self.check_throttles(request)
    	
        
        def check_permissions(self, request):
            # [对象,对象,]
            for permission in self.get_permissions():
                if not permission.has_permission(request, self):
                    self.permission_denied(request, message=getattr(permission, 'message', None))
        def permission_denied(self, request, message=None):
            if request.authenticators and not request.successful_authenticator:
                raise exceptions.NotAuthenticated()
            raise exceptions.PermissionDenied(detail=message)
            
            
        def get_permissions(self):
            return [permission() for permission in self.permission_classes]
        
    class UserView(APIView):
        permission_classes = [MyPermission, ]
        
        def get(self,request,*args,**kwargs):
            return Response('user')
    

    流程分析:

    1. 当前请求到来时,执行 dispatch方法中的 initial 方法,其中执行了check_permissions(request)方法
    2. check_permissions(request)中 get_permissions()先获取 权限类对象的列表,然后循环每个对象,执行每个对象的has_permission()(自定制的),有权限返回True、没有返回False.
    能够定制错误信息。
    
  • 相关阅读:
    怎么保存退出vi编辑
    rpmlib(PayloadIsLzma) <= 4.4.6-1 is needed【转载】
    自制rpm包
    程序员应该具备的十个代码习惯
    面试时可以问的问题
    Git教程(二)-如何上传和同步自己的git项目
    Git教程及问题解析
    HTML5调用百度地图API进行地理定位实例
    PHP基于单例模式编写PDO类的方法
    PHP输出缓存ob系列函数详解
  • 原文地址:https://www.cnblogs.com/yzm1017/p/11954059.html
Copyright © 2011-2022 走看看