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写的贪吃蛇游戏例子
Jun 16 Python
python里对list中的整数求平均并排序
Sep 12 Python
python模拟鼠标拖动操作的方法
Mar 11 Python
python将MongoDB里的ObjectId转换为时间戳的方法
Mar 13 Python
详解Python的Django框架中的模版继承
Jul 16 Python
python决策树之CART分类回归树详解
Dec 20 Python
浅析Python数据处理
May 02 Python
python接口自动化测试之接口数据依赖的实现方法
Apr 26 Python
Django框架中间件定义与使用方法案例分析
Nov 28 Python
利用Python实现Excel的文件间的数据匹配功能
Jun 16 Python
python和php学习哪个更有发展
Jun 17 Python
Python操作MySQL数据库的示例代码
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
用php过滤危险html代码的函数
2008/07/22 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
2014/09/04 PHP
利用laravel搭建一个迷你博客实战教程
2017/08/13 PHP
js模拟弹出效果代码修正版
2008/08/07 Javascript
javascript 网页跳转的方法
2008/12/24 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
js实现简单的验证码
2015/12/25 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
2017/03/08 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
JS实现页面打印(整体、局部)
2017/08/18 Javascript
WebStorm ES6 语法支持设置&babel使用及自动编译(详解)
2017/09/08 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
浅谈Vuex注入Vue生命周期的过程
2019/05/20 Javascript
vue3+typescript实现图片懒加载插件
2020/10/26 Javascript
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
Python实现一个服务器监听多个客户端请求
2018/04/12 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
python生成n个元素的全组合方法
2018/11/13 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
Django 内置权限扩展案例详解
2019/03/04 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
深入了解Django View(视图系统)
2019/07/23 Python
python excel转换csv代码实例
2019/08/26 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
幼儿园消防安全制度
2014/01/26 职场文书
党员创先争优活动总结
2014/05/04 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
费城故事观后感
2015/06/10 职场文书
爱的教育读书笔记
2015/06/26 职场文书
大学学习委员竞选稿
2015/11/20 职场文书