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 logging
Apr 15 Python
python enumerate函数的使用方法总结
Nov 15 Python
Python金融数据可视化汇总
Nov 17 Python
Python实现字典(dict)的迭代操作示例
Jun 05 Python
Python中反射和描述器总结
Sep 23 Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 Python
关于pytorch中网络loss传播和参数更新的理解
Aug 20 Python
Python实现的微信红包提醒功能示例
Aug 22 Python
Python图像处理二值化方法实例汇总
Jul 24 Python
小结Python的反射机制
Sep 28 Python
如何基于Python爬虫爬取美团酒店信息
Nov 03 Python
Python异常类型以及处理方法汇总
Jun 05 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
2020年4月新番动漫目录 官方宣布4月播出的作品一览
2020/03/08 日漫
php 分页类 扩展代码
2009/06/11 PHP
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
javascript显示选择目录对话框的代码
2008/11/10 Javascript
详谈JavaScript 匿名函数及闭包
2014/11/14 Javascript
JavaScript中的console.dir()函数介绍
2014/12/29 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
2016/09/17 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
[54:53]完美世界DOTA2联赛PWL S2 GXR vs PXG 第二场 11.18
2020/11/18 DOTA
python 自动化将markdown文件转成html文件的方法
2016/09/23 Python
对python中raw_input()和input()的用法详解
2018/04/22 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
Python多进程与服务器并发原理及用法实例分析
2018/08/21 Python
python 字符串只保留汉字的方法
2018/11/16 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
2019/05/13 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
python 默认参数相关知识详解
2019/09/18 Python
Python如何优雅删除字符列表空字符及None元素
2020/06/25 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
2018/10/08 HTML / CSS
HTML5 weui使用笔记
2019/11/21 HTML / CSS
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
C#怎么让一个窗口居中显示?
2015/10/20 面试题
高分子材料与工程专业个人求职信
2013/12/15 职场文书
关于母亲节的感言
2014/02/04 职场文书
党支部换届选举方案
2014/05/08 职场文书
需求分析说明书
2014/05/09 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
七年级作文之环保作文
2019/10/17 职场文书
Java Dubbo框架知识点梳理
2021/06/26 Java/Android