• 小谈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
  • 相关阅读:
    ArcSDE安装报 “contains an incorrect path”
    vs对话框"发生生成错误,是否继续并运行上次的成功生成"的设置
    修改XML节点名称
    git 常用
    mysql 执行sql流程
    DocumentBuilderFactory.newInstance() 异常解决
    samba 配置
    ajax jquery
    c++ map
    javacc jjtree 写法 以及 jj写法 基本语法 以及应用
  • 原文地址:https://www.cnblogs.com/richard_A/p/13818088.html
Copyright © 2020-2023  润新知