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

posted @ 2018-03-06 17:39  九二零  阅读(139)  评论(0编辑  收藏  举报