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 相关文章推荐
用pywin32实现windows模拟鼠标及键盘动作
Apr 22 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
python 读取视频,处理后,实时计算帧数fps的方法
Jul 10 Python
Python后台管理员管理前台会员信息的讲解
Jan 28 Python
Python爬虫 批量爬取下载抖音视频代码实例
Aug 16 Python
使用python实现画AR模型时序图
Nov 20 Python
Jupyter Notebook输出矢量图实例
Apr 14 Python
python seaborn heatmap可视化相关性矩阵实例
Jun 03 Python
Python Tornado核心及相关原理详解
Jun 24 Python
关于tensorflow softmax函数用法解析
Jun 30 Python
Python3爬虫中关于Ajax分析方法的总结
Jul 10 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 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
使用数据库保存session的方法
2006/10/09 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
2014/04/08 PHP
PHP递归删除目录几个代码实例
2014/04/21 PHP
PHP列出MySQL中所有数据库的方法
2015/03/12 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
AJAX跨域请求json数据的实现方法
2013/11/11 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
jQuery实现的输入框选择时间插件用法实例
2015/02/28 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
javascript实现实时输出当前的时间
2015/04/27 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
2015/09/11 Javascript
jQuery层次选择器用法示例
2016/09/09 Javascript
关于在mongoose中填充外键的方法详解
2017/08/14 Javascript
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
[02:33]DOTA2英雄基础教程 司夜刺客
2013/12/04 DOTA
零基础写python爬虫之神器正则表达式
2014/11/06 Python
Python初学者常见错误详解
2019/07/02 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
印度尼西亚手表和包包商店:Urban Icon
2019/12/12 全球购物
酒店销售主管岗位职责
2014/01/04 职场文书
村级环境卫生整治方案
2014/05/04 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
golang 实现Location跳转方式
2021/05/02 Golang
MySQL COUNT函数的使用与优化
2021/05/10 MySQL
一文带你探究MySQL中的NULL
2021/11/11 MySQL
详细聊聊浏览器是如何看闭包的
2021/11/11 Javascript