基本思路(原生Django而言):

  在django2.x中,若出现节流(访问频率控制)的需求,我们首先想到的是使用一个字典(dict类型)来存储所有IP地址的访问时间记录,这是针对于匿名用户(IP)而言的

{"111.222.3.44": [1000, 900, 700, 500, 10....],"1.333.44.555": [1200, 900, 20, 10.....]
}

  原生request的消息体中,在environ下的REMOTE_ADDR保存了客户端的IP地址

  

  由于请求经过WSGIRequest封装后,必经中间件层,所以考虑通过中间件来实现节流功能

from django.utils.deprecation import MiddlewareMixin
from django.http.response import HttpResponse
import timeMAX_PER_VISITED_NUMS = 3
VISITED_IP_THROTTLE = dict()class ThrottleMiddleware(MiddlewareMixin):"""节流中间件VISITED_IP_THROTTLE每分钟最大访问次数"""def request_allowed(self, request):"""自定义访问频率限制器, 用于限制匿名用户的访问频率限制"""ip = request.META['REMOTE_ADDR']cur_time = time.time()# 如果ip在限制器中有记录if ip in VISITED_IP_THROTTLE:visiting_record = VISITED_IP_THROTTLE[ip]while visiting_record:# 与列表中最后一次访问记录的时间差大于60秒, 移除最后一次记录并继续循环if cur_time - 60 >= visiting_record[-1]:visiting_record.pop(-1)continue# 访问记录列表超过最大访问次数if len(visiting_record) >= MAX_PER_VISITED_NUMS:return False# 与列表中最后一次访问记录的时间差小于60秒
                visiting_record.insert(0, cur_time)return True# 无记录则新建该IP访问记录VISITED_IP_THROTTLE[ip] = list()VISITED_IP_THROTTLE[ip].insert(0, cur_time)return Truedef process_request(self, request):if self.request_allowed(request):print(True)return HttpResponse("True")else:print(False)return HttpResponse("False")

  运行结果:

  

  这是针对在访问用户较少的情况下才采用的全局变量来存储访问记录, 实际情况中,最好使用redis作为缓存来存储记录。

restframework版:

  自定义节流控制器

  使用redis缓存访问记录(hash类型)

  redispool.py(作连接池, 参数设置为你自己的redis连接信息)

import redis
from vue_shop import settingsREDIS_POOL = redis.ConnectionPool(**settings.REDIS_KWARGS)

  throttle.py

import time
import redis
from utils.redispool import REDIS_POOL
import json
from rest_framework.throttling import SimpleRateThrottleclass AnonymityUserThrottle(object):"""自定义匿名用户节流器, 采用redis缓存访问记录MAX_PER_VISITED_NUMS: 每分钟最高访问次数name: 缓存(redis)中,hash类型的name"""MAX_PER_VISITED_NUMS = 3name = "AnonymityVisitedRecord"def allow_request(self, request, view):"""进行是否可访问的逻辑判断:param request: drf's request:param view::return: bool"""IP_ADDR = request.META.get("REMOTE_ADDR", None)cur_visit_time = time.time()redis_conn = redis.Redis(connection_pool=REDIS_POOL)ips_record = redis_conn.hget(self.name, IP_ADDR)print(ips_record)if ips_record:history_visit_list = json.loads(ips_record.decode())while history_visit_list:# [120, 99, 40]# 最远一次访问时间B与当前时间A的时间差大于60秒,则删除B,如此循环if cur_visit_time - history_visit_list[-1] >= 60:history_visit_list.pop(-1)redis_conn.hset(self.name, IP_ADDR, json.dumps(history_visit_list))continueif len(history_visit_list) > self.MAX_PER_VISITED_NUMS:return Falsehistory_visit_list.insert(0, cur_visit_time)redis_conn.hset(self.name, IP_ADDR, json.dumps(history_visit_list))return Truenew_ip_record = list()new_ip_record.insert(0, cur_visit_time)redis_conn.hset(self.name, IP_ADDR, json.dumps(new_ip_record))return Truedef wait(self):"""Optionally, return a recommended number of seconds to wait beforethe next request."""return None

  运行结果:

  

  内置的节流控制器

class SimpleAnonymityUsertThrottle(SimpleRateThrottle):"""使用restframework内置的节流类,针对于的匿名用户的访问控制"""scope = "Anonymity"def get_cache_key(self, request, view):"""返回用户的唯一标识"""# return request.META.get("REMOTE_ADDR")return self.get_ident(request)class CertifiedUserThrottle(SimpleRateThrottle):"""对认证通过的用户进行节流控制"""scope = "CertifiedUser"def get_cache_key(self, request, view):"""返回唯一用户标识"""return request.user.username

   scope参数依赖配置:

REST_FRAMEWORK =
{'DEFAULT_THROTTLE_RATES': {'Anonymity': '3/m','realUser': '6/m',},
}

  

转载于:https://www.cnblogs.com/kisun168/p/11352998.html

restframework之节流相关推荐

  1. 防抖 节流_关于防抖和节流

    虾扯蛋之函数防抖和节流 - 掘金 先贴贴 这个哥们的. 因为我看了很多,感觉大多都是复制.没有啥思考 在介绍以下这些问题的时候.先公示下我思考的时候出现的问题 1.如果你使用 onclick 和 ad ...

  2. rest-framework之解析器

    rest-framework之解析器 本文目录 一 解析器的作用 二 全局使用解析器 三 局部使用解析器 四 源码分析 回到目录 一 解析器的作用 根据请求头 content-type 选择对应的解析 ...

  3. 经常可能会用到的【函数节流和函数防抖】记录下,做下区分

    今天突然被人问到,函数节流和函数防抖的区别是什么, 结果我脑子一热直接举了个滚动条的粟子说是优化高频率执行的手段,就记得自己是用setTimeout来实现的. 完了区别是什么??哪个是哪个都蒙B了 回 ...

  4. 防抖 节流_每日一题手写函数防抖与节流

    关注"前端学苑" ,坚持每天进步一点点 「~函数防抖与节流 ~」 每日一题,希望让爱学习.思考的前端技术伙伴在一起学习.复盘.成长. 基础知识要夯实,原理源码要深入,深度广度要扩展 ...

  5. 节流与防抖【从0到0.1】

    Debounce 和 throttle 是我们在 JavaScript 中使用的两个概念,用于增强对函数执行的控制,这在事件处理程序中特别有用.这两种技术都回答了同一个问题"一段时间内某个函 ...

  6. 前端面试查漏补缺--(一) 防抖和节流

    前言 本系列最开始是为了自己面试准备的.后来发现整理越来越多,差不多有十二万字符,最后决定还是分享出来给大家. 为了分享整理出来,花费了自己大量的时间,起码是只自己用的三倍时间.如果喜欢的话,欢迎收藏 ...

  7. 云计算设计模式(二十三)——Throttling节流模式

    云计算设计模式(二十三)--Throttling节流模式 控制由应用程序使用,一个单独的租户或整个服务的一个实例的资源的消耗.这样的模式能够同意系统继续执行并满足服务水平协议.即使当添加需求的资源放置 ...

  8. 输入防抖 vue # 输入搜索的时候 及时搜索的快速访问接口的 解决方案 vue 中使用防抖和节流

    输入防抖 vue # 输入搜索的时候 及时搜索的快速访问接口的 解决方案 vue 中使用防抖和节流 参考文章: (1)输入防抖 vue # 输入搜索的时候 及时搜索的快速访问接口的 解决方案 vue ...

  9. vue防抖和节流是什么_防抖和节流为什么重要!!!

    是什么 防抖和节流两者类似[但并不一样]是用来控制某一函数在特定时间内执行次数的技术点. 什么时候重要 在给Dom绑定事件的时候显得尤为重要,因为相当于在事件函数和Dom之间加了一层控制层. 为什么重 ...

最新文章

  1. C# using 语法说明
  2. java观察者模式类图_设计模式(十八)——观察者模式(JDK Observable源码分析)...
  3. 鲁迅说:“智能不够,人工来凑”
  4. 2020人工神经网络第一次作业
  5. ftp安装和虚拟用户创建(终于搞清楚了)
  6. 中国SaaS死或生之四:卧榻之侧,是谁在捅刀 SaaS?
  7. LeadTools Android 入门教学——运行第一个Android Demo
  8. java里的字符流_javaIO流中字符流的应用
  9. php常用函数time
  10. Java语言中的-----访问修饰符
  11. 爬虫-访问登陆可见的页面-利用session类-补实例
  12. html入门的常见问题
  13. Atitit jdk net golang sdk标准库对比 Atitit sdk封装的艺术 艾提拉著 1. 重要模块8个 1 1.1. Collections集合,core,net,io,
  14. Excel文件导入web页面
  15. 南阳理工ACM 28大数阶乘
  16. 2794: [Poi2012]Cloakroom
  17. android 打开wifi并链接到制定ip,在安卓WiFi-Direct连接中获取对等设备IP地址的方法及设备与流程...
  18. layui table表格中加input 日期插件
  19. 性价比高的口粮酒推荐,聪明人都选这3款,口感醇厚,纯粮好喝
  20. 能ping通ip但无法ping通域名和localhost //ping: bad address 'www.baidu.com'

热门文章

  1. Java 多线程 - 线程 - 守护线程
  2. Android LayoutInflater 动态地添加删除View
  3. Apache Sentry 第一弹:Server启动、连接Hue、分组详解
  4. 【经验之谈】Git使用之TortoiseGit配置VS详解
  5. 关于InnoDB索引长度限制的tips
  6. 古老的 vscode 下载地址
  7. html怎么只操作第一个li,css3如何选择第一个子元素?
  8. PAT 乙级 1022. D进制的A+B (20) Java版
  9. php 警告方法 不可用,升级PHP版本后警告信息的逐一解决
  10. 前端接收pdf文件_原生ajax请求获取pdf文件流本地下载(支持谷歌IE)