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 无权访问
原文地址:https://www.cnblogs.com/xujunkai/p/11849762.html