• Django:RestFramework之-------权限


    4.restframework-权限

    4.1权限:

    • 权限在单个视图应用。
    class MyPermission(object):
        """认证类"""
        def has_permission(self,request,view):
            """重写has_permission方法"""
            #判断用户类型
            if request.user.user_type != 3:
                return False
            return True
    class OrderView(APIView):
        """订单业务  (只有SVIP能看到)"""
        #message当权限未通过,返回内容。
        message = "必须是SVIP才可以进行访问"
        authentication_classes = [Authtication,]#用于认证
        permission_classes = [MyPermission,]#用于权限控制
        def get(self,request,*args,**kwargs):
            
            ret = {"code": 1000, "msg": None, "data": None}
            try:
                ret['data'] = ORDER_DICT
            except Exception as e:
                pass
            return JsonResponse(ret)
    
    • 效果:

      • 当用于在url键入user_type=1的用户拒绝访问:http://127.0.0.1:8000/api/v1/order/?token=408a04dbce13814fd076807f865429b4

      • 当用户在url键入user_type=3的用户拿到数据库内容:http://127.0.0.1:8000/api/v1/order/?token=f2c781da6953632d0c5421e8cb17e740

    4.2权限源码解析

    #-----------------------dispatch---------------------------
    
    #执行dispatch方法:
    def dispatch(self, request, *args, **kwargs):
        ...
    	#封装request,获取一个加强版request
    	request = self.initialize_request(request, *args, **kwargs)
        ...
        #执行初始化方法
    	self.initial(request, *args, **kwargs)
        ...
    #-----------------------------------------------------------
    #-----------------------initial---------------------------
    def initial(self, request, *args, **kwargs):
        ...
        self.check_permissions(request)#进行权限检验。
        ...
    #-----------------------------------------------------------
    #-----------------------check_permissions-------------------
     def check_permissions(self, request):
            # 列表存储着 权限类的对象
            for permission in self.get_permissions():
                #如果是自定义权限类必须有has_permission方法。这样才能进行权限判断,权限认证时,当什么都没有返回表示正常执行,触发异常表示权限验证失败。  message就是触发异常后回的异常消息.
                if not permission.has_permission(request, self):
                    self.permission_denied(
                        request, message=getattr(permission, 'message', None)
                    )
     #循环遍历self.get_permissions(),那么self.get_permissions()做什么事情呢?进入看一下
    #--------------------get_permissions------------------------ 
        def get_permissions(self):
            return [permission() for permission in self.permission_classes]
        
    #通过遍历permission_classes,返回一个列表。
    #而在我们没有在视图定义:permission_classes时候会默认找配置文件的permission_classes,如下:
    permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
    #-----------------------------------------------------------
    
    
    
    
    

    4.3全局和局部配置权限:

    #全局配置settings.py配置
    "DEFAULT_PERMISSION_CLASSES":['app.utils.permission.MyPermission']
        
    #局部配置
    permission_classes = [MyPermission,]#用于权限控制,MyPermission自定义权限类
    

    4.4django内置权限类

    from rest_framework.permissions import BasePermission
    class BasePermission(metaclass=BasePermissionMetaclass):
        """
        A base class from which all permission classes should inherit.
        """
    	#定义has_permission方法
        def has_permission(self, request, view):
            """
            Return `True` if permission is granted, `False` otherwise.
            """
            return True
    
        def has_object_permission(self, request, view, obj):
            """
            Return `True` if permission is granted, `False` otherwise.
            """
            return True
    #允许任何访问
    class AllowAny(BasePermission):pass
    
    

    4.5权限使用流程:(自定义权限类)

    • 为了规范:以后写权限类,要继承BasePermission.

    • 返回值:

      • True 有权访问
      • False 无权访问
  • 相关阅读:
    网络对抗技术 20192424 Exp7 网络欺诈防范
    CAN帧格式解析
    C语言复杂的指针
    堆栈段的用途
    uniapp益智五子棋小程序
    穿山甲GroMore广告—(Banner广告)——Android_Unity广告系列文章03
    穿山甲GroMore广告(概览)——Unity游戏接入广告Android篇02
    穿山甲GroMore广告—(信息流广告)——Android_Unity广告系列文章04
    使用Android发布Unity无法破解的问题
    Json Number Format 异常 Expected an int but was 2168520652 at line 1 column 325
  • 原文地址:https://www.cnblogs.com/xujunkai/p/11849762.html
Copyright © 2020-2023  润新知