小谈DRF之权限相关

2. 权限

先抛出一个问题:不同的视图不同的权限可以访问。比如:订单相关视图只允许SVIP才能访问。

2.1 权限的简单实现(Django版本)

class OrderView(APIView):
    """订单相关(只有SVIP可以访问)"""

    authentication_classes = [Authentication, ]

    def get(self, request, *args, **kwargs):
        # print(request.user) # ---> UserInfo object
        # print(request.auth) # ---> UserToken object
        if request.user.user_type != 3:
            return HttpResponse('无权访问')
        ret = {'code': 10000, 'msg': None, 'data': None}
        try:
            ret['data'] = ORDER_DICT
        except Exception as e:
            pass
        return JsonResponse(ret)

当用普通账号的token测试后的结果为:

image-20200908230116984

当用SVIP账号的token测试后的结果为:

image-20200908230229828

2.2 权限的简单使用(restframwork版本)

还是上面的简单问题,现在用restframework的权限相关功能实现:

class MyPermission(object):
    def has_permission(self, request, view):
        if request.user.user_type != 3:
            return False
        return True

from django.http import HttpResponse

class OrderView(APIView):
    """订单相关(只有SVIP可以访问)"""

    authentication_classes = [Authentication, ]
    permission_classes = [MyPermission, ]

    def get(self, request, *args, **kwargs):
        # print(request.user) # ---> UserInfo object
        # print(request.auth) # ---> UserToken object
        ret = {'code': 10000, 'msg': None, 'data': None}
        try:
            ret['data'] = ORDER_DICT
        except Exception as e:
            pass
        return JsonResponse(ret)

当用普通账号的token测试后的结果为:

image-20200908230906185

当用SVIP账号的token测试后的结果为:

image-20200908230937591

2.3 权限源码流程分析

1 前面的源码分析和认证相关的一样,只是在initial()方法中,涉及到了权限的源码:

image-20200908233908987

2 点开check_permissions()方法,查看其源码:

image-20200908234247114

2.1.1 点开get_permissions()方法,查看其源码:

image-20200908234041162

2.1.2 发现权限的源码和认证的源码几乎一样,而且点开permission_classes的源码发现权限的全局设置和认证的全局设置也是一样的:

image-20200908234155920

2.2.1 如果权限认证失败,走到了permission_denied()方法,查看其源码,就是抛出异常:

image-20200908234447944

2.4 权限的配置文件

由上面的2.1.2发现,权限的全局配置或者局部配置与认证的全局配置或局部配置是一样的。

2.5 权限的内置类

或者叫 rest framework基于内置类实现的权限控制

​ 点击from restframework.permissons import BasePermission中的BasePermission我们可以看出也是和认证的内置类几乎一样,所以以后我们在写自定义的权限类时应该继承于BasePermission;还有就是无论是认证还是权限,我们几乎用不到内置类,如果项目有需求都是要自己按需求写的,所以了解即可。

image-20200908235216408

再次点开BasePermission类,查看其源码:

image-20200908235254427
原文地址:https://www.cnblogs.com/richard_A/p/13818088.html