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入门学习之字符串与比较运算符
Oct 12 Python
python搭建微信公众平台
Feb 09 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
Mar 19 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
Mar 01 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
Aug 13 Python
Django app配置多个数据库代码实例
Dec 17 Python
python如何使用jt400.jar包代码实例
Dec 20 Python
如何基于Python实现word文档重新排版
Sep 29 Python
Python用Jira库来操作Jira
Dec 28 Python
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
Nov 11 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面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
CodeIgniter框架中_remap()使用方法2例
2014/03/10 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
深入理解PHP 数组之count 函数
2016/06/13 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
JavaScript 学习点滴记录
2009/04/24 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
JavaScript中的isXX系列是否继续使用的分析
2011/04/16 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
jquery 隐藏与显示tr标签示例代码
2014/06/06 Javascript
AngularJS执行流程详解
2017/02/17 Javascript
Vue+axios 实现http拦截及路由拦截实例
2017/04/25 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
JS实现的简单表单验证功能示例
2017/10/13 Javascript
浅谈vue路径优化之resolve
2017/10/13 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
用Python代码来绘制彭罗斯点阵的教程
2015/04/03 Python
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
python实现线程池的方法
2015/06/30 Python
tensorflow学习笔记之简单的神经网络训练和测试
2018/04/15 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
详解flask入门模板引擎
2018/07/18 Python
Python 最大概率法进行汉语切分的方法
2018/12/14 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
python读取图片的几种方式及图像宽和高的存储顺序
2020/02/11 Python
Python生成随机验证码代码实例解析
2020/06/09 Python
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
校运会入场式解说词
2014/02/10 职场文书
人力管理专业毕业生求职信
2014/02/27 职场文书
岗位廉政承诺书
2014/03/27 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
学习退步检讨书
2014/09/28 职场文书
离婚起诉书范本
2015/05/18 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript