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中定义,
用来在没有权限的时候返回信息。
中天一片无情月,是我平生不悔心