权限组件的使用方式:
原理和使用方式与认证相似。
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中定义,
用来在没有权限的时候返回信息。