zoukankan      html  css  js  c++  java
  • jQuery火箭图标返回顶部代码

    DRF的权限 

    权限是什么

    大家之前都应该听过权限~那么我们权限到底是做什么用的呢~~

    大家都有博客~或者去一些论坛~一定知道管理员这个角色~

    比如我们申请博客的时候~一定要向管理员申请~也就是说管理员会有一些特殊的权利~是我们没有的~~

    这些对某件事情决策的范围和程度~我们叫做权限~~权限是我们在项目开发中非常常用到的~~

    那我们看DRF框架给我们提供的权限组件都有哪些方法~~

    权限组件源码

    我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~

    其实我们版本,认证,权限,频率控制走的源码流程大致相同~~大家也可以在源码里看到~~

    我们的权限类一定要有has_permission方法~否则就会抛出异常~~这也是框架给我提供的钩子~~

    我们先看到在rest_framework.permissions这个文件中~存放了框架给我们提供的所有权限的方法~~

    我这里就不带着大家详细去看每一个了~大家可以去浏览一下每个权限类~看看每个都是干嘛的~~

    这里主要说下BasePermission 这个是我们写权限类继承的一个基础权限类~~~ 

    权限的详细用法

    在这里我们一定要清楚一点~我们的Python代码是一行一行执行的~那么执行initial方法初始化这些组件的时候~~

    也是有顺序的~~我们的版本在前面~然后是认证,然后是权限~ 最后是频率~~所以大家要清楚~~

    我们的权限执行的时候~我们的认证已经执行结束了~~~

    前提在model中的UserInfo表中加了一个字段~用户类型的字段~~做好数据迁移~~

    class MyPermission(BasePermission):
        message = "VIP用户才能访问"
    
        def has_permission(self, request, view):
            """
            自定义权限只有vip用户能访问,
            注意我们初始化时候的顺序是认证在权限前面的,所以只要认证通过~
            我们这里就可以通过request.user,拿到我们用户信息
            request.auth就能拿到用户对象
            """
            if request.user and request.auth.type == 2:
                return True
            else:
                return False
    第一步 写权限类
    class TestAuthView(APIView):
        authentication_classes = [MyAuth, ]
        permission_classes = [MyPermission, ]
    
        def get(self, request, *args, **kwargs):
            print(request.user)
            print(request.auth)
            username = request.user
            return Response(username)
    局部视图注册
    REST_FRAMEWORK = {
        # 默认使用的版本控制类
        'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
        # 允许的版本
        'ALLOWED_VERSIONS': ['v1', 'v2'],
        # 版本使用的参数名称
        'VERSION_PARAM': 'version',
        # 默认使用的版本
        'DEFAULT_VERSION': 'v1',
        # 配置全局认证
        # 'DEFAULT_AUTHENTICATION_CLASSES': ["BRQP.utils.MyAuth", ]
        # 配置全局权限
        "DEFAULT_PERMISSION_CLASSES": ["BROP.utils.MyPermission"]
    }
    全局注册 settings.py

    DRF的频率

    频率限制是做什么的

    开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用。

    我们的DRF提供了一些频率限制的方法,我们看一下。

    频率组件源码

    版本,认证,权限,频率这几个组件的源码是一个流程,这里就不再带大家走源码了~

    相信大家可以自己看懂了~~下面我们谈谈频率组件实现的原理~~

    频率组件原理

    DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定义的方法来实现。

    当我们请求进来,走到我们频率组件的时候,DRF内部会有一个字典来记录访问者的IP,

    以这个访问者的IP为key,value为一个列表,存放访问者每次访问的时间,

    {  IP1: [第三次访问时间,第二次访问时间,第一次访问时间],}

    把每次访问最新时间放入列表的最前面,记录这样一个数据结构后,通过什么方式限流呢~~

    如果我们设置的是10秒内只能访问5次,

      -- 1,判断访问者的IP是否在这个请求IP的字典里

      -- 2,保证这个列表里都是最近10秒内的访问的时间

          判断当前请求时间和列表里最早的(也就是最后的)请求时间的查

          如果差大于10秒,说明请求以及不是最近10秒内的,删除掉,

          继续判断倒数第二个,直到差值小于10秒

      -- 3,判断列表的长度(即访问次数),是否大于我们设置的5次,

          如果大于就限流,否则放行,并把时间放入列表的最前面。

    频率组件的详细用法

    频率组件的配置方式其实跟上面的组件都一样,我们看下频率组件的使用。

    VISIT_RECORD = {}
    class MyThrottle(object):
    
        def __init__(self):
            self.history = None
    
        def allow_request(self, request, view):
            """
            自定义频率限制60秒内只能访问三次
            """
            # 获取用户IP
            ip = request.META.get("REMOTE_ADDR")
            timestamp = time.time()
            if ip not in VISIT_RECORD:
                VISIT_RECORD[ip] = [timestamp, ]
                return True
            history = VISIT_RECORD[ip]
            self.history = history
            history.insert(0, timestamp)
            while history and history[-1] < timestamp - 60:
                history.pop()
            if len(history) > 3:
                return False
            else:
                return True
    
        def wait(self):
            """
            限制时间还剩多少
            """
            timestamp = time.time()
            return 60 - (timestamp - self.history[-1])
    自定义的频率限制类
    REST_FRAMEWORK = {
        # ......
        # 频率限制的配置
        "DEFAULT_THROTTLE_CLASSES": ["Throttle.throttle.MyThrottle"],
        }
    }
    配置自定义频率限制
    from rest_framework.throttling import SimpleRateThrottle
    
    
    class MyVisitThrottle(SimpleRateThrottle):
        scope = "WD"
    
        def get_cache_key(self, request, view):
            return self.get_ident(request)
    使用自带的频率限制类
    REST_FRAMEWORK = {
        # 频率限制的配置
        # "DEFAULT_THROTTLE_CLASSES": ["Throttle.throttle.MyVisitThrottle"],
        "DEFAULT_THROTTLE_CLASSES": ["Throttle.throttle.MyThrottle"],
        "DEFAULT_THROTTLE_RATES":{
            'WD':'5/m',         #速率配置每分钟不能超过5次访问,WD是scope定义的值,
    
        }
    }
    配置频率限制

    我们可以在postman~~或者DRF自带的页面进行测试都~~可以没什么区别~~ 

  • 相关阅读:
    模板 无源汇上下界可行流 loj115
    ICPC2018JiaozuoE Resistors in Parallel 高精度 数论
    hdu 2255 奔小康赚大钱 最佳匹配 KM算法
    ICPC2018Beijing 现场赛D Frog and Portal 构造
    codeforce 1175E Minimal Segment Cover ST表 倍增思想
    ICPC2018Jiaozuo 现场赛H Can You Solve the Harder Problem? 后缀数组 树上差分 ST表 口胡题解
    luogu P1966 火柴排队 树状数组 逆序对 离散化
    luogu P1970 花匠 贪心
    luogu P1967 货车运输 最大生成树 倍增LCA
    luogu P1315 观光公交 贪心
  • 原文地址:https://www.cnblogs.com/MayDayTime/p/9890809.html
Copyright © 2011-2022 走看看