一  自定义频率控制类

  1. class MyThrottle():
  2. visitor_dic = {}
  3.  
  4. def __init__(self):
  5. self.history = None
  6.  
  7. def allow_request(self, request, view):
  8. '''
  9. {'ip1':[时间1 ,时间2],
  10. 'ip2':[时间1, ],
  11. }
  12. #(1)取出访问者ip
  13. # (2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走
  14. # (3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间,
  15. # (4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过
  16. # (5)当大于等于3,说明一分钟内访问超过三次,返回False验证失败
  17. '''
  18.  
  19. # Meta:请求所有的东西的字典
  20. # 拿出ip地址
  21. ip = request.META.get('REMOTE_ADDR')
  22. # 不在字典中,说明是第一次访问
  23. ctime = time.time()
  24. if ip not in self.visitor_dic:
  25. self.visitor_dic[ip] = [ctime, ]
  26. return True
  27. # 根据当前访问者ip,取出访问的时间列表
  28. history = self.visitor_dic[ip]
  29. self.history = history
  30. while history and ctime - history[-1] > 60:
  31. history.pop()
  32.  
  33. if len(history) < 3:
  34. # 把当前时间放到第0个位置上
  35. history.insert(0, ctime)
  36. return True
  37.  
  38. return False
  39.  
  40. def wait(self):
  41. # 剩余时间
  42. ctime = time.time()
  43. return 60 - (ctime - self.history[-1])

二  内置频率控制

在app中新建一个文件,来放相关组件:

  1. from rest_framework.throttling import SimpleRateThrottle
  2. class VisitThrottle(SimpleRateThrottle):
  3. scope = 'hhh'
  4. def get_cache_key(self, request, view):
  5. return self.get_ident(request)

在settings中配置访问:

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_THROTTLE_RATES':{
  3. 'hhh':'3/m'
  4. }
  5. }

在视图函数中:(局部配置)

  1. throttle_classes = [MyThrottles,]

错误信息提示转换为中文:

  1. class Course(APIView):
  2. authentication_classes = [TokenAuth, ]
  3. permission_classes = [UserPermission, ]
  4. throttle_classes = [MyThrottles,]
  5.  
  6. def get(self, request):
  7. return HttpResponse('get')
  8.  
  9. def post(self, request):
  10. return HttpResponse('post')
  11. def throttled(self, request, wait):
  12. from rest_framework.exceptions import Throttled
  13. class MyThrottled(Throttled):
  14. default_detail = '傻逼啊'
  15. extra_detail_singular = '还有 {wait} second.'
  16. extra_detail_plural = '出了 {wait} seconds.'
  17. raise MyThrottled(wait)

其他

内置频率限制类:

BaseThrottle是所有类的基类:方法:def get_ident(self, request)获取标识,其实就是获取ip,自定义的需要继承它

AnonRateThrottle:未登录用户ip限制,需要配合auth模块用

SimpleRateThrottle:重写此方法,可以实现频率现在,不需要咱们手写上面自定义的逻辑

UserRateThrottle:登录用户频率限制,这个得配合auth模块来用

ScopedRateThrottle:应用在局部视图上的(忽略)

内置频率全局配置:

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_THROTTLE_CLASSES':['app01.utils.VisitThrottle',],
  3. 'DEFAULT_THROTTLE_RATES':{
  4. 'hhh':'3/m'
  5. }
  6. }

rest_framework之访问频率控制的更多相关文章

  1. nginx 访问频率控制

    Nginx访问频率控制 HTTP服务器的吞吐率(单位时间吞吐量)通常有一个上限,尤其是普通配置的机器,在带宽够的情况下,用压测工具经常能把服务器压出翔,为了线上环境稳定性,防止恶意攻击影响到其他用户, ...

  2. openresty开发系列37--nginx-lua-redis实现访问频率控制

    openresty开发系列37--nginx-lua-redis实现访问频率控制 一)需求背景 在高并发场景下为了防止某个访问ip访问的频率过高,有时候会需要控制用户的访问频次在openresty中, ...

  3. Django REST framework 内置访问频率控制

    对匿名用户采用 IP 控制访问频率,对登录用户采用 用户名 控制访问频率. from rest_framework.throttling import SimpleRateThrottle class ...

  4. Django rest-framework框架-访问频率控制

    第一版: from rest_frameworkclass VisitThrottle(object): def __init__(self): self.history = None def all ...

  5. DRF之访问权限控制和访问频率控制(节流)

    权限控制 前言 用户验证用户权限,根据不同访问权限控制对不同内容的访问. 建议了解视图.token验证的内容. 使用流程 自定义访问权限类,继承BasePermission,重写has_permiss ...

  6. WebApi接口访问频率控制的实现

    关于限流的文章,博客园内还是有挺多的.本文做了一个基于Filter限流的例子,算是对WebApiThrottle使用的一个具体的实例. 实现方法: 1.使用Nuget,对WebAPI项目添加WebAp ...

  7. django基于中间件的IP访问频率控制

    一.中间件的代码 注意:成功时返回的是None,那样才会走视图层,返回httpresponse就直接出去了 import time from django.utils.deprecation impo ...

  8. 四、django rest_framework源码之频率控制剖析

    1 绪言 权限判定之后的下一个环节是访问频率控制,本篇我们分析访问频率控制部分源码. 2 源码分析 访问频率控制在dispatch方法中的initial方法调用check_throttles方法开始. ...

  9. rest_framework 节流功能(访问频率)

    访问记录 = { 身份证号: [ :: ,::, ::] } #:: ,::,:: ,::, #:: #[::, ::, ::] #访问记录 = { 用户IP: [...] } import time ...

随机推荐

  1. Pedometer_forAndroid

    https://github.com/Nicky213Zhang/Pedometer_forAndroid 自行封装了一个计步器控件,采用:计步传感器Sensor.TYPE_STEP_COUNTER计 ...

  2. easyui- grid前台分页

    function pagerFilter(data) { if (typeof data.length == 'number' && typeof data.splice == 'fu ...

  3. Jetty修改默认端口

    1.webserver: Jetty2.version:   7.6.5, 8.1.53.operation: 修改默认端口3.1 修改Jetty目录下的/etc/jetty.xml 文件中的[por ...

  4. tp三级联动

    <script type="text/javascript">$(document).ready(function(){  $("#province" ...

  5. 列出自己常用的jdk中的数据结构

    列出自己常用的jdk中的数据结构 解答:线性表,链表,哈希表是常用的数据结构.

  6. 图像处理之拼接---图像拼接opencv

    基于SURF特征的图像与视频拼接技术的研究和实现(一)      一直有计划研究实时图像拼接,但是直到最近拜读西电2013年张亚娟的<基于SURF特征的图像与视频拼接技术的研究和实现>,条 ...

  7. Django 最佳实践

    不错的Django实践规范,转自Github: https://github.com/brantyoung/zh-django-best-practices/blob/master/readme.rs ...

  8. CSS中的绝对定位(absolute)误区

    这几天在慕课上看视频学习,偶然听到几个老师都说:CSS绝对定位在没有其他有除static定位的包含块的情况下是以body进行定位,如果要想相对当前元素的父元素来定位,父元素一定要设置position: ...

  9. spark(1.1) mllib 源码分析(三)-朴素贝叶斯

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/4042467.html 本文主要以mllib 1.1版本为基础,分析朴素贝叶斯的基本原理与源码 一.基本原 ...

  10. 【机器学习】WIFI室内定位

    WIFI室内定位-指纹法 在A1区域内每个点上采集四个WiFi的信号数据(信号强度),五点.九点.十六点采样. 5*5=25区域*16数据=400样本,用来训练 样本数 R B G1  G2 1 2 ...