rest_framework之访问频率控制
一 自定义频率控制类
- class MyThrottle():
- visitor_dic = {}
- def __init__(self):
- self.history = None
- def allow_request(self, request, view):
- '''
- {'ip1':[时间1 ,时间2],
- 'ip2':[时间1, ],
- }
- #(1)取出访问者ip
- # (2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走
- # (3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间,
- # (4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过
- # (5)当大于等于3,说明一分钟内访问超过三次,返回False验证失败
- '''
- # Meta:请求所有的东西的字典
- # 拿出ip地址
- ip = request.META.get('REMOTE_ADDR')
- # 不在字典中,说明是第一次访问
- ctime = time.time()
- if ip not in self.visitor_dic:
- self.visitor_dic[ip] = [ctime, ]
- return True
- # 根据当前访问者ip,取出访问的时间列表
- history = self.visitor_dic[ip]
- self.history = history
- while history and ctime - history[-1] > 60:
- history.pop()
- if len(history) < 3:
- # 把当前时间放到第0个位置上
- history.insert(0, ctime)
- return True
- return False
- def wait(self):
- # 剩余时间
- ctime = time.time()
- return 60 - (ctime - self.history[-1])
二 内置频率控制
在app中新建一个文件,来放相关组件:
- from rest_framework.throttling import SimpleRateThrottle
- class VisitThrottle(SimpleRateThrottle):
- scope = 'hhh'
- def get_cache_key(self, request, view):
- return self.get_ident(request)
在settings中配置访问:
- REST_FRAMEWORK = {
- 'DEFAULT_THROTTLE_RATES':{
- 'hhh':'3/m'
- }
- }
在视图函数中:(局部配置)
- throttle_classes = [MyThrottles,]
错误信息提示转换为中文:
- class Course(APIView):
- authentication_classes = [TokenAuth, ]
- permission_classes = [UserPermission, ]
- throttle_classes = [MyThrottles,]
- def get(self, request):
- return HttpResponse('get')
- def post(self, request):
- return HttpResponse('post')
- def throttled(self, request, wait):
- from rest_framework.exceptions import Throttled
- class MyThrottled(Throttled):
- default_detail = '傻逼啊'
- extra_detail_singular = '还有 {wait} second.'
- extra_detail_plural = '出了 {wait} seconds.'
- raise MyThrottled(wait)
其他
内置频率限制类:
BaseThrottle是所有类的基类:方法:def get_ident(self, request)获取标识,其实就是获取ip,自定义的需要继承它
AnonRateThrottle:未登录用户ip限制,需要配合auth模块用
SimpleRateThrottle:重写此方法,可以实现频率现在,不需要咱们手写上面自定义的逻辑
UserRateThrottle:登录用户频率限制,这个得配合auth模块来用
ScopedRateThrottle:应用在局部视图上的(忽略)
内置频率全局配置:
- REST_FRAMEWORK = {
- 'DEFAULT_THROTTLE_CLASSES':['app01.utils.VisitThrottle',],
- 'DEFAULT_THROTTLE_RATES':{
- 'hhh':'3/m'
- }
- }
rest_framework之访问频率控制的更多相关文章
- nginx 访问频率控制
Nginx访问频率控制 HTTP服务器的吞吐率(单位时间吞吐量)通常有一个上限,尤其是普通配置的机器,在带宽够的情况下,用压测工具经常能把服务器压出翔,为了线上环境稳定性,防止恶意攻击影响到其他用户, ...
- openresty开发系列37--nginx-lua-redis实现访问频率控制
openresty开发系列37--nginx-lua-redis实现访问频率控制 一)需求背景 在高并发场景下为了防止某个访问ip访问的频率过高,有时候会需要控制用户的访问频次在openresty中, ...
- Django REST framework 内置访问频率控制
对匿名用户采用 IP 控制访问频率,对登录用户采用 用户名 控制访问频率. from rest_framework.throttling import SimpleRateThrottle class ...
- Django rest-framework框架-访问频率控制
第一版: from rest_frameworkclass VisitThrottle(object): def __init__(self): self.history = None def all ...
- DRF之访问权限控制和访问频率控制(节流)
权限控制 前言 用户验证用户权限,根据不同访问权限控制对不同内容的访问. 建议了解视图.token验证的内容. 使用流程 自定义访问权限类,继承BasePermission,重写has_permiss ...
- WebApi接口访问频率控制的实现
关于限流的文章,博客园内还是有挺多的.本文做了一个基于Filter限流的例子,算是对WebApiThrottle使用的一个具体的实例. 实现方法: 1.使用Nuget,对WebAPI项目添加WebAp ...
- django基于中间件的IP访问频率控制
一.中间件的代码 注意:成功时返回的是None,那样才会走视图层,返回httpresponse就直接出去了 import time from django.utils.deprecation impo ...
- 四、django rest_framework源码之频率控制剖析
1 绪言 权限判定之后的下一个环节是访问频率控制,本篇我们分析访问频率控制部分源码. 2 源码分析 访问频率控制在dispatch方法中的initial方法调用check_throttles方法开始. ...
- rest_framework 节流功能(访问频率)
访问记录 = { 身份证号: [ :: ,::, ::] } #:: ,::,:: ,::, #:: #[::, ::, ::] #访问记录 = { 用户IP: [...] } import time ...
随机推荐
- Pedometer_forAndroid
https://github.com/Nicky213Zhang/Pedometer_forAndroid 自行封装了一个计步器控件,采用:计步传感器Sensor.TYPE_STEP_COUNTER计 ...
- easyui- grid前台分页
function pagerFilter(data) { if (typeof data.length == 'number' && typeof data.splice == 'fu ...
- Jetty修改默认端口
1.webserver: Jetty2.version: 7.6.5, 8.1.53.operation: 修改默认端口3.1 修改Jetty目录下的/etc/jetty.xml 文件中的[por ...
- tp三级联动
<script type="text/javascript">$(document).ready(function(){ $("#province" ...
- 列出自己常用的jdk中的数据结构
列出自己常用的jdk中的数据结构 解答:线性表,链表,哈希表是常用的数据结构.
- 图像处理之拼接---图像拼接opencv
基于SURF特征的图像与视频拼接技术的研究和实现(一) 一直有计划研究实时图像拼接,但是直到最近拜读西电2013年张亚娟的<基于SURF特征的图像与视频拼接技术的研究和实现>,条 ...
- Django 最佳实践
不错的Django实践规范,转自Github: https://github.com/brantyoung/zh-django-best-practices/blob/master/readme.rs ...
- CSS中的绝对定位(absolute)误区
这几天在慕课上看视频学习,偶然听到几个老师都说:CSS绝对定位在没有其他有除static定位的包含块的情况下是以body进行定位,如果要想相对当前元素的父元素来定位,父元素一定要设置position: ...
- spark(1.1) mllib 源码分析(三)-朴素贝叶斯
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/4042467.html 本文主要以mllib 1.1版本为基础,分析朴素贝叶斯的基本原理与源码 一.基本原 ...
- 【机器学习】WIFI室内定位
WIFI室内定位-指纹法 在A1区域内每个点上采集四个WiFi的信号数据(信号强度),五点.九点.十六点采样. 5*5=25区域*16数据=400样本,用来训练 样本数 R B G1 G2 1 2 ...