3月6日学习内容整理:restframework的权限功能
一、源码流程:和认证非常类似
1、URL路由匹配成功后首先执行as_view方法,实际上执行的是API的as_view,其中又用super方法执行V的as_view,再是执行V的view方法,再是执行dispatch方法,注意这里就会执行API中的dispatch方法
2、同样执行API中的initialize_request方法,将原生的request重新封装为Reuqest对象,就行执行initial函数,其中的check_permissions方法就是用来做权限操作的
def initial(self, request, *args, **kwargs): # 认证方法 self.perform_authentication(request) # 权限方法 self.check_permissions(request)
3、在权限方法check_permissions中,会循环permission_classes列表中存放着的每一个权限类对象,依次执行权限对象的has_permission方法
二、权限函数返回值,也就是has_permission
返回true代表有权访问
返回false代表无权访问
三、基本使用:
# 自定义权限类 class MyPermission(object): # 必须要有这个方法 def has_permission(self, request, view): if request.user.user_type != 3: return False return True class OrderView(APIView): """ 订单相关业务(只有SVIP用户有权限) """ # 这个参数就会让rest找到我们自定义的权限类,而不去找默认的权限类 permission_classes = [MyPermission, ] def get(self, request, *args, **kwargs): # request.user # request.auth ret = {'code': 1000, 'msg': None, 'data': None} try: ret['data'] = ORDER_DICT except Exception as e: pass return JsonResponse(ret)#
注意注意:::
在自定义权限类中,若定义了message参数,那么抛出异常时就会显示message参数值了
在我们自己写的has_permission权限函数中一般不要抛异常,return false的话rest的权限功能就会自动抛异常了,这是在check_permissions和permission_denied定义好的
四、从视图角度分为全局和局部使用权限功能
1、局部使用
在自定义view类中定义好permission_classes列表参数,存放自定义权限类,自定义权限类必须要有has_permission方法,返回true或false,代表有权和无权访问
2、全局使用
和认证一样,rest查找默认权限类的时候也是去配置文件中找的,所以我们要想让所有的视图都经过权限操作,就要在自己的配置文件中设置:注意这里和认证中的全局使用配置信息是在一个字典REST_FRAMEWORK中写
REST_FRAMEWORK = { # 这个字段就代表权限类,列表中是一个个权限类的路径 "DEFAULT_PERMISSION_CLASSES":['api.utils.permission.SVIPPermission'] }
五、rest的内置权限类
基于内置的权限类,我们在自定义权限类的时候可以继承这个BasePermission内置类,代码入下第二图,必须写has_permission方法
# 都在这里面 from rest_framework.permissions import BasePermission
class BasePermission(object): def has_permission(self, request, view): return True def has_object_permission(self, request, view, obj): return True
补充:权限类的has_object_permission方法
是用来判断登录用户是否对某个对象具有操作权限
具体是执行GenericAPIView的get_object方法时,又调用check_object_permissions方法,这个方法就会循环设置的权限类,依次调用权限类的has_object_permission