Django REST framework使用及源码分析之权限

权限组件的使用方式:
原理和使用方式与认证相似。
views.py
class OrderView(APIView):
    '''
    订单相关业务,返回订单字典。
    添加验证功能,验证是否已登录。
    '''
    authentication_classes = [Authtication,]
    permission_classes = [MyPermission1, ]
    '''该刚就是添加Authtication认证,可以添加多个,如果是一个空列表,则不认证,也就是可以跳过认证'''
    def get(self,request,*args,**kwargs):
        ret = {'code':1000,'msg':None}
        try:
            ret['data'] = ORDER_DICT
        except Exception as e:
            pass
        return  JsonResponse(ret)
上面是个简单的视图函数,继承了APIView,
permission_classes这个列表写了那个权限类就判断哪个权限。

app/utils/permission.py

from rest_framework.permissions import BasePermission
class MyPermission(BasePermission):
    # message = "必须是SVIP才能访问"
    '''权限验证,有权限为True'''
    def has_permission(self,request,view):
        if request.user.user_type != 3:
            return False
        return True

class MyPermission1(BasePermission):

    def has_permission(self,request,view):
        if request.user.user_type == 3:
            return False
        return True
将权限类写到单独的配置文件,继承BasePermission基类,
重写has_permission方法,返回True为有权限,False为没权限。

settings.py 全局配置

REST_FRAMEWORK = {
    # 全局使用的认证类
    "DEFAULT_AUTHENTICATION_CLASSES":['app.utils.auth.Authtication', ],
    "UNAUTHENTICATED_USER":None, # 匿名,request.user = None
    "UNAUTHENTICATED_TOKEN":None,# 匿名,request.auth = None
    "DEFAULT_PERMISSION_CLASSES":['app.utils.permission.MyPermission1'],
}
全局的权限控制,如果想单独定义某个视图的权限,只需在视图中单独定义即可,优先读取本地权限。
 
 
源码:
dispatch
    -inital
        -self.check_permissions(request)

  

    -get_permission()

    

            循环权限类并实例化对象。
                -permission.has_permission
                    执行has_permission方法,判断结果为True or False
                    我们一般就重写这个方法来实现权限的控制。
                    -permission_denied    
                        结果为Flase执行permission_denied 抛出异常。
                        permission_denied有个参数是message,可以在has_permission中定义,
                        用来在没有权限的时候返回信息。
原文地址:https://www.cnblogs.com/ArmoredTitan/p/8807761.html