1.简介

控制访问频率的组件

2.使用

手写一个自定义频率组件

import time
#频率限制
#自定义频率组件,return True则可以访问,return False则不能访问
class MyThrottle():
    visitor_dic={}
    def __init__(self):
        self.history=None
    def allow_request(self,request,view):
        '''
        {'ip1':[时间1,时间2],
        'ip2':[时间1,],
        }
        '''
        # 基本原理
        #1.取出访问者ip
        #2.判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走
        #3.循环判断当前ip的列表,有值,并且当前时间减去最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间,
        #4.判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过
        #5.当大于等于3,说明一分钟内访问超过三次,返回False验证失败

        #META:请求所有的东西的字典
        ip=request.META.get('REMOTE')
        print(ip)
        #不在字典中,说明是第一次访问
        ctime=time.time()
        if ip not  in self. visitor_dic:
            self.visitor_dic[ip]=[ctime,]
            return True
        #根据当前访问者ip,取出访问的时间列表
        history=self.visitor_dic[ip]
        self.history=history
        while history and ctime -history[-1]>60:
            #pop默认是删除最后一项的
            history.pop()
        if len(history)<3:
            #把当前时间放到第0个位置上,
            history.insert(0,ctime)
            return True
        return False
    #设定了访问频率,则要设定wait函数,返回的是剩余时间
    def wait(self):
        ctime=time.time()
        return 60-(ctime-self.history[-1])

真正写一个频率组件

在settings里写配置

REST_FRAMEWORK={
    'DEFAULT_THROTTLE_CLASS':['app01.MyAuth.MyThrottle',],
    'DEFAULT_THROTTLE_RATES':{'aaa':'3/m'}
}

在MyAuth进行定义

from rest_framework.throttling import SimpleRateThrottle
class MyThrottle(SimpleRateThrottle):
    #scope要与settings里进行对应,可以找到限制的频率
    scope='aaa'
    def get_cache_key(self, request, view):
        #内部做了啥事
        #返回ip地址
        #ip=request.META.get('REMOTE_ADDR')
        #return ip
        #这里返回的是ip,如果想限制域名,则下面返回的则需要是域名
        return self.get_ident(request)

可以在views里进行重写错误信息

class Authors(APIView):
    throttle_classes = [MyAuth.MyThrottle, ]

    # authentication_classes = [MyAuth.LoginAuth,]
    # permission_classes = [MyAuth.UserPermission,]
    def get(self, request):
        response = {'status': 100, 'msg': '查询成功'}
        ret = models.Author.objects.all()
        author_ser = MySer.AuthorSerializer(ret, many=True)
        response['data'] = author_ser.data
        return JsonResponse(response, safe=False)

    # 重写错误显示信息
    def throttled(self, request, wait):
        class MyThrottled(exceptions.Throttled):
            default_detail = '煞笔'
            extra_detail_singular = '还剩{wait}秒'
            extra_detail_plural = '还剩{wait}秒'

        raise MyThrottled(wait)

全局使用,在settings里进行设置

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': ['app01.MyAuth.MyThrottle', ],
    'DEFAULT_THROTTLE_RATES': {
        'aaa': '10/m'
    }
}

drf频率组件的更多相关文章

  1. drf 频率组件 META字典详情

    drf频率组件 什么是频率 控制用户对某个url的请求频率,比如一分钟之内,只能访问三次 自定义频率规则 1.取出访问者ip 2.判断当前ip在不在访问字典中: 不在,则添加进去,返回True; 3. ...

  2. DRF框架(七) ——三大认证组件之频率组件、jwt认证

    drf频率组件源码 1.APIView的dispatch方法的  self.initial(request,*args,**kwargs)  点进去 2.self.check_throttles(re ...

  3. 【DRF频率】

    目录 使用自带的频率限制类 使用自定义的频率限制类 开发平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. DRF就为我们提供了一些频率限制的方法. DRF中的版本.认证.权限 ...

  4. DRF(5) - 频率组件、url注册器、响应器、分页器

    一.频率组件 1.使用DRF简单频率控制实现对用户进行访问频率控制 1)导入模块,定义频率类并继承SimpleRateThrottle # 导入模块 from rest_framework.throt ...

  5. DRF之权限认证频率组件

    概要 retrieve方法源码剖析 认证组件的使用方式及源码剖析 权限组件的使用方式及源码剖析 频率组件的使用方式及源码剖析 知识点复习回顾 Python逻辑运算 知识点复习回顾一:Python逻辑运 ...

  6. Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)

    一.认证组件 使用方法: ①写一个认证类,新建文件:my_examine.py # 导入需要继承的基类BaseAuthentication from rest_framework.authentica ...

  7. drf框架 - 三大认证组件 | 认证组件 | 权限组件 | 频率组件

    RBAC 基于用户权限访问控制的认证 - Role-Based Access Control Django框架采用的是RBAC认证规则,RBAC认证规则通常会分为 三表规则.五表规则,Django采用 ...

  8. drf token刷新配置、认证组件(使用)、权限组件(使用)、频率组件(使用)、异常组件(使用)

    目录 一.特殊路由映射的请求 二.token刷新机制配置(了解) 三.认证组件项目使用:多方式登录 1.urls.py 路由 2.views.py 视图 3.serializers.py 序列化 4. ...

  9. drf三大组件之频率认证组件

    复习 """ 1.认证组件:校验认证字符串,得到request.user 没有认证字符串,直接放回None,游客 有认证字符串,但认证失败抛异常,非法用户 有认证字符串, ...

随机推荐

  1. mysql性能调整三板斧

    大意是,用2/8原则,多快好省的解决大部分事情.所以三板斧,仅限整体调整,不牵扯具体细节. 1.innodb 使用innodb引擎 2.innodb_buffer_pool 调整和innodb有关的参 ...

  2. IDEA自动编译设置

    ctrl+alt+s: ctrl+shift+alt+/:

  3. mongodb new file allocation failure

    话说那天正在向mongodb中写入数据,突然就蹦出了 new file allocation failure ,以为是数据有错误,就检查了一番,可没问题啊,看着像是mongo自己的问题,于是百度了一番 ...

  4. Elasticsearch 学习之不停止服务,完成升级重启维护操作

    我们可以设置集群的平衡参数来暂时禁用掉平衡,具体步骤如下: 1.如果可能的话,先暂停掉数据新增和更新操作,这样会提高集群恢复的时间: 2.禁用集群分片平衡操作,直到告诉集群可以恢复平衡操作为止,禁用配 ...

  5. Redmine发布新闻,自动发送邮件功能失效恢复

    问题描述:操作数据库,修改项目公开状体后,创建新闻,自动发送邮件功能失效. 问题检查和恢复测试: 1.检查管理员权限 2.重新手动配置项目公开状态,覆盖数据操作 3.对比其他正常项目数据库状态,进行恢 ...

  6. python3之枚举

    枚举 li = ['a','b','c','d'] for index,i in enumerate(li): #for index,i in enumerate(li,100): print(ind ...

  7. Tomcat8配置用户名密码

    配置内容: 1.vim   tomcat-user.xml 添加以下内容 <role rolename="manager-gui"/> <role rolenam ...

  8. 7.26-STOIRegularMatch-08-#14

    A-3 SRM 08 描述 给一个 01 串设为其 S,询问是否存在只出现两次的 01 串 T. 这里的出现定义为存在一串下标 ,满足  且 . 输入格式 一行,一个 01 串 输出格式 一行,字母 ...

  9. centos 7 部署 MQTT

    官方教程  :头痛的是nginx 和 mqtt布局有所冲突,后台不能使用需要调整,当然是用 nginx自家的布局没问题,但是要收费 官方地址 1.由于emqttd是用Erlang语言编写的,所以,在L ...

  10. [No000018B]写代码要用 Vim,因为越难入门的工具回报越大

    编者按:现在的技术界有一种倾向,将软件/应用操作简单化,用户能轻松上手.但是工具是否强大,取决于它能否灵活地满足使用者的各种需要.有些工具虽然很难入门,学会了便能对自己的操作有更深的层次的了解,能赋予 ...