Django Rest framework频率原理与限制


Posted in Python onJuly 26, 2019

前言

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

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

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

DRF频率组件原理

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

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

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

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

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

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

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

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

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

继续判断倒数第二个、第三个,直到差小于10秒为止

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

如果大于,则限制其访问

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

使用自带的频率限制类

首先 配置频率限制类

from rest_framework.throttling import SimpleRateThrottle # 导入内置的频率限制类

class DRFThrottle(SimpleRateThrottle):
  """注意:这里都是必备的属性、方法和返回值"""
  scope = 'WD'
  def get_cache_key(self, request, view):
    # 拿IP地址
    return self.get_ident(request)

然后 配置文件

REST_FRAMEWORK = {
  # 指定频率限制的类
  "DEFAULT_THROTTLE_CLASSES": ['blog.throttle.DRFThrottle'],
  # WD是scope定义的值,3/m表示每分钟不能超过3次访问
  "DEFAULT_THROTTLE_RATES": {"WD": "3/m"},
}

"""
如果只是想给单个视图做频率限制:
则删除这里的"DEFAULT_THROTTLE_CLASSES"配置项
并在要做频率限制的视图中指定频率限制类即可
指定语法:throttle_classes = ["频率限制类", ]
"""

开始测试

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

Django Rest framework频率原理与限制

使用自定义的频率限制类

首先 自定义频率限制类

import time

VISIT_RECORD = {} # 限制访问次数的字典

class MyThrottle():
  """
  自定义频率限制类,一分钟允许访问5次
  注意:自定义频率限制类中必须要有allow_request和wait方法
  前者用于频率限制的逻辑,后者用于返回限制时间还剩多少秒
  """

  def __init__(self):
    self.history = []

  def allow_request(self, request, view):
    """用于限制访问的逻辑"""
    # 获取用户的IP地址
    ip = request.META.get('REMOTE_ADDR')
    if ip not in VISIT_RECORD:
      VISIT_RECORD[ip] = [time.time(), ]
    else:
      history = VISIT_RECORD[ip]
      self.history = history
      history.insert(0, time.time())
      # 确保访问时间在允许范围之内
      while self.history[0] - self.history[-1] > 60:
        self.history.pop()
      # 确定访问次数在允许的范围内
      if len(self.history) >= 5:
        return False
    return True

  def wait(self):
    """用于返回限制时间还剩多少秒"""
    return 60 - (self.history[0] - self.history[-1])

然后 配置文件

REST_FRAMEWORK = {
  # 指定自定义的频率限制类
  "DEFAULT_THROTTLE_CLASSES": ['blog.throttle.MyThrottle'],
}

> """
如果只是想给单个视图做频率限制:
则删除这里的"DEFAULT_THROTTLE_CLASSES"配置项
并在要做频率限制的视图中指定频率限制类即可
指定语法:throttle_classes = ["频率限制类", ]
"""

好了,就到这里吧.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 文件操作技巧(File operation) 实例代码分析
Aug 11 Python
python3+PyQt5实现自定义分数滑块部件
Apr 24 Python
Python多进程multiprocessing.Pool类详解
Apr 27 Python
OpenCV 轮廓检测的实现方法
Jul 03 Python
深入了解Python iter() 方法的用法
Jul 11 Python
Python爬虫 批量爬取下载抖音视频代码实例
Aug 16 Python
python实现删除列表中某个元素的3种方法
Jan 15 Python
Pycharm中Python环境配置常见问题解析
Jan 16 Python
python实现将列表中各个值快速赋值给多个变量
Apr 02 Python
python speech模块的使用方法
Sep 09 Python
Python爬虫入门教程01之爬取豆瓣Top电影
Jan 24 Python
如何用Python和JS实现的Web SSH工具
Feb 23 Python
Django 使用easy_thumbnails压缩上传的图片方法
Jul 26 #Python
解决django服务器重启端口被占用的问题
Jul 26 #Python
深入解析神经网络从原理到实现
Jul 26 #Python
python单例模式的多种实现方法
Jul 26 #Python
django的ORM操作 增加和查询
Jul 26 #Python
Django在pycharm下修改默认启动端口的方法
Jul 26 #Python
Python解析命令行读取参数之argparse模块
Jul 26 #Python
You might like
PHP file_get_contents 函数超时的几种解决方法
2009/07/30 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
PHP实现合并discuz用户
2015/08/05 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
Javascript UrlDecode函数代码
2010/01/09 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
javascript的正则匹配方法学习
2016/02/24 Javascript
javascript Promise简单学习使用方法小结
2016/05/17 Javascript
关于Stream和Buffer的相互转换详解
2017/07/26 Javascript
Canvas放置反弹效果随机图形(实例)
2017/08/17 Javascript
jquery如何实现点击空白处隐藏元素
2017/12/05 jQuery
解析Json字符串的三种方法日常常用
2018/05/02 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
jQuery HTML获取内容和属性操作实例分析
2020/05/20 jQuery
JavaScript React如何修改默认端口号方法详解
2020/07/28 Javascript
Python Tkinter基础控件用法
2014/09/03 Python
使用Python多线程爬虫爬取电影天堂资源
2016/09/23 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
使用python实现对元素的长截图功能
2019/11/14 Python
Python类中self参数用法详解
2020/02/13 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
scrapy实践之翻页爬取的实现
2021/01/05 Python
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
Origins悦木之源英国官网:雅诗兰黛集团高端植物护肤品牌
2017/11/06 全球购物
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
SQL注入攻击的种类有哪些
2013/12/30 面试题
日语专业毕业生自荐信
2013/11/11 职场文书
办公室岗位职责
2014/02/12 职场文书
校园广播站开场白
2015/06/01 职场文书
无婚姻登记记录证明
2015/06/18 职场文书
股东协议书范本2016
2016/03/21 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书