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

DRF就为我们提供了一些频率限制的方法.

DRF中的版本、认证、权限、频率组件的源码是一个流程,且频率组件在最后执行.

@


DRF频率组件原理

·

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

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

以这个字典的IP为key,value为一个列表,存放访问者每次访问的时间:{PI1: [第三次访问时间, 第二次访问时间, 第一次访问时间, ]}

把每次访问的最新时间放入列表的最前面,记录这样一个数据结构后,通过如下方式限制:

·

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

  1. 判断访问者的IP是否在这个请求IP的字典里.
  2. 保证这个列表里都是都是最近10秒内访问的时间.

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

    : 如果差大于10秒,说明请求不是最近10秒内的,删除掉最后一个

    : 继续判断倒数第二个、第三个,直到差小于10秒为止
  3. 判断列表的长度(即访问次数)是否大于我们设置的5次.

    : 如果大于,则限制其访问

    : 如果小于,则放行,并把时间记录到列表的最前面

使用自带的频率限制类

首先 配置频率限制类

  1. from rest_framework.throttling import SimpleRateThrottle # 导入内置的频率限制类
  2. class DRFThrottle(SimpleRateThrottle):
  3. """注意:这里都是必备的属性、方法和返回值"""
  4. scope = 'WD'
  5. def get_cache_key(self, request, view):
  6. # 拿IP地址
  7. return self.get_ident(request)

然后 配置文件

  1. REST_FRAMEWORK = {
  2. # 指定频率限制的类
  3. "DEFAULT_THROTTLE_CLASSES": ['blog.throttle.DRFThrottle'],
  4. # WD是scope定义的值,3/m表示每分钟不能超过3次访问
  5. "DEFAULT_THROTTLE_RATES": {"WD": "3/m"},
  6. }
  7. """
  8. 如果只是想给单个视图做频率限制:
  9. 则删除这里的"DEFAULT_THROTTLE_CLASSES"配置项
  10. 并在要做频率限制的视图中指定频率限制类即可
  11. 指定语法:throttle_classes = ["频率限制类", ]
  12. """

开始测试

访问测试页面,连续刷新3次后,可看到:


使用自定义的频率限制类

首先 自定义频率限制类

  1. import time
  2. VISIT_RECORD = {} # 限制访问次数的字典
  3. class MyThrottle():
  4. """
  5. 自定义频率限制类,一分钟允许访问5次
  6. 注意:自定义频率限制类中必须要有allow_request和wait方法
  7. 前者用于频率限制的逻辑,后者用于返回限制时间还剩多少秒
  8. """
  9. def __init__(self):
  10. self.history = []
  11. def allow_request(self, request, view):
  12. """用于限制访问的逻辑"""
  13. # 获取用户的IP地址
  14. ip = request.META.get('REMOTE_ADDR')
  15. if ip not in VISIT_RECORD:
  16. VISIT_RECORD[ip] = [time.time(), ]
  17. else:
  18. history = VISIT_RECORD[ip]
  19. self.history = history
  20. history.insert(0, time.time())
  21. # 确保访问时间在允许范围之内
  22. while self.history[0] - self.history[-1] > 60:
  23. self.history.pop()
  24. # 确定访问次数在允许的范围内
  25. if len(self.history) >= 5:
  26. return False
  27. return True
  28. def wait(self):
  29. """用于返回限制时间还剩多少秒"""
  30. return 60 - (self.history[0] - self.history[-1])

然后 配置文件

  1. REST_FRAMEWORK = {
  2. # 指定自定义的频率限制类
  3. "DEFAULT_THROTTLE_CLASSES": ['blog.throttle.MyThrottle'],
  4. }
  5. > """
  6. 如果只是想给单个视图做频率限制:
  7. 则删除这里的"DEFAULT_THROTTLE_CLASSES"配置项
  8. 并在要做频率限制的视图中指定频率限制类即可
  9. 指定语法:throttle_classes = ["频率限制类", ]
  10. """

好了,就到这里吧.

【DRF频率】的更多相关文章

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

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

  2. DRF频率、分页、解析器、渲染器

    DRF的频率 频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定 ...

  3. drf频率组件

    1.简介 控制访问频率的组件 2.使用 手写一个自定义频率组件 import time #频率限制 #自定义频率组件,return True则可以访问,return False则不能访问 class ...

  4. DRF的认证,频率,权限

    1,DRF的认证 初识认证:浏览器是无状态的,一次导致每次发的请求都是新的请求,所以每次请求,服务器都会进行校验,这样就很繁琐,这趟我们就需要给每一个用户登录后一个新的标识,浏览器每次都会带着这个唯一 ...

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

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

  6. Django REST Framework(DRF)_第三篇

    DRF版本控制 介绍 我们在看APIView源码时可以看到,版本和版本控制类是通过determine_version的返回值获取的 version, scheme = self.determine_v ...

  7. DRF之频率限制、分页、解析器和渲染器

    一.频率限制 1.频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 2.频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通 ...

  8. DRF框架之 用户角色权限与访问频率的权限设置

    1. 简单演示,创建一个models的数据库表 class User(models.Model): name=models.CharField(max_length=32) pwd=models.Ch ...

  9. DRF 权限和频率

    Django Rest Framework 权限组件 DRF的权限 权限组件源码解析 我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~ 其实我们版本 ...

随机推荐

  1. [Bug]Python3.x SyntaxError: 'ascii' codec can't decode byte 0xe4 in position

    安装arch后就没再用python了 昨天管服务器的大佬在跑贝叶斯分类器的时候发现正确率有问题 我赶紧去做优化,然后就有这样的报错 Python 3.6.4 (default, Jan 5 2018, ...

  2. [转载]CentOS 7虚拟机下设置固定IP详解

    在 复制 他人作品之前,是因为我再此“跌倒”过一次,虽然原主说是永久地址,但是地址失效 不可避免.所以就原封不动的copy了过来,我自己也是按照他的一步一步配置的,我成功了,相信你们也会成功. 如果不 ...

  3. CSU 1446 Modified LCS 扩展欧几里得

    要死了,这个题竟然做了两天……各种奇葩的错误…… HNU的12831也是这个题. 题意: 给你两个等差数列,求这两个数列的公共元素的数量. 每个数列按照以下格式给出: N F D(分别表示每个数列的长 ...

  4. ArcGIS api for javascript——渲染-使用唯一值渲染

    描述 本例使用唯一值渲染器来作为美国的符号.每个州有一个字符串属性"SUB_REGION"表示它的国家的地区.UniqueValueRenderer.addValue()方法被用来 ...

  5. 用typename和template消除歧义

  6. Thrift 基础教程(一)安装篇

    1.Thrift简单介绍 Thrift是一款由Fackbook开发的可伸缩.跨语言的服务开发框架,该框架已经开源而且增加的Apache项目.Thrift主要功能是:通过自己定义的Interface D ...

  7. URAL 1823. Ideal Gas(数学啊 )

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1823 1823. Ideal Gas Time limit: 0.5 second Me ...

  8. MVP模式入门(结合Rxjava,Retrofit)

    本文MVP的sample实现效果: github地址:https://github.com/xurui1995/MvpSample 老规矩,在说对MVP模式的理解之前还是要再谈谈MVC模式,了解了MV ...

  9. Gym - 100203G Good elements 水+模拟

    题意:good element的定义是a[i]在1~i-1中任取三个数(可以重复)的和能等于a[i] 思路:vis[x]标记一下任两个数的和,处理a[i]时枚举1~i-1判断vis[a[i] - a[ ...

  10. excel2007去掉方括号及里面的

    获取括号外面的 b2=LEFT(A1,FIND("[",A1)-1) 获取括号里面的 =MID(A2,FIND("(",A2)+1,(FIND(")& ...