day85
频率校验
源码分析
声明:基于rest_framework的频率校验
1.首先我们进入到APIView下的dispatch,因为由此方法开始分发的

2.可以看到dispatch方法下有一个initial的方法,进入该方法

3.由此进入频率控制

4.进入check_throttles方法,我们发现他最终是调用了该方法,所以我们需要在自定义时,写上这个方法

5.同时我们进入上张图中的迭代对象,发现与认证组件和权限控制一样他也需要在视图类中写一个列表

6.最后我们想他若是频率控制住后需要返回信息来到BaseThrottle,发现可以重写wait返回一个数字。

代码实现
自定义频率控制
from rest_framework.throttling import BaseThrottle, SimpleRateThrottle
import time class MyThrottle(BaseThrottle):
dic = {'ip': []} def __init__(self):
now_time = 0
history = [] def allow_request(self, request, view):
self.now_time = time.time()
ip = request.META.get("REMOTE_ADDR")
if ip not in self.dic:
self.dic[ip] = [self.now_time, ]
return True
self.history = self.dic.get(ip)
while self.history and self.now_time - self.history[-1] > 60:
self.history.pop() if len(self.history) < 3:
self.history.insert(0, self.now_time)
return True
return False def wait(self):
return 60 - (self.now_time - self.history[-1])
视图函数
from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView
from app01 import the
from rest_framework import exceptions class User(APIView):
throttle_classes = [the.MyThrottle, ] def get(self, request):
return HttpResponse('get') def post(self, request):
return HttpResponse('post')
使用rest_framework自带的频率控制
settting中设置
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_RATES': {
'ttt': '3/m'
}
}
在试图类中写一个继承Throttled的类可以控制返回信息为中文
def throttled(self, request, wait):
class Mythrottled(exceptions.Throttled):
default_detail = '访问次数过多'
extra_detail_singular = '剩余 {wait} 秒后访问.'
extra_detail_plural = '剩余 {wait} 秒后访问.' raise Mythrottled(wait)
在py文件中设置相关值
class MyThrottle(SimpleRateThrottle):
scope = 'ttt' def get_cache_key(self, request, view):
# self.get_ident( request)
return request.META.get('REMOTE_ADDR')
局部控制
局部使用:
-在视图类中写
throttle_classes = [MyThrottle,]
全局控制
全局使用:
-在setting中写
'DEFAULT_THROTTLE_CLASSES':['app01.MyAuth.MyThrottle',],
-局部禁用:
-在视图类中写
throttle_classes = []
day85的更多相关文章
- day85 ModuleForm Form组件
1 forms组件与modelform组件 forms组件: https://www.cnblogs.com/yuanchenqi/articles/9036474.htmlmodelForm组件:h ...
- python 全栈开发,Day85(Git补充,随机生成图片验证码)
昨日内容回顾 第一部分:django相关 1.django请求生命周期 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这 ...
- day85:luffy:购物车根据有效期不同切换价格&购物车删除操作&价格结算&订单页面前戏
目录 1.购物车有效期切换 2.根据有效期不同切换价格 3.购物车删除操作 4.价格结算 5.订单页面-初始化 1.购物车有效期切换 1.关于有效期表结构的设计 1.course/models.py ...
- 10.13 Django随笔
2018-10-13 14:20:59 越努力,越幸运! 永远不要高估自己! Django的渲染是在render()时候渲染的,然后把字符串传给浏览器 Django请求流程, 跨域 参考链接: htt ...
- 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】
点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...
- 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天)
点击了解更多Python课程>>> 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天) 课程大纲 1.这一期比之前的Python培新课程增加了很多干货:Linux ...
- 国内某Python大神自创完整版,系统性学习Python
很多小伙伴纠结于这个一百天的时间,我觉得完全没有必要,也违背了我最初放这个大纲上来的初衷,我是觉得这个学习大纲还不错,自学按照这个来也能相对系统的学习知识,而不是零散细碎的知识最后无法整合,每个人的基 ...
- 22期老男孩Ptython全栈架构师视频教程
老男孩Ptython全栈架构师视频教程 Python最新整理完整版22期视频教程 超60G课程容量<ignore_js_op> <ignore_js_op> <ignor ...
随机推荐
- 在线客服兼容谷歌Chrome、苹果Safari、Opera浏览器的修改
纵览全网提供的众多号称兼容多浏览器的自动收缩在线客服,其实只兼容了IE和FF两种,当遇到谷歌Chrome.苹果Safari.Opera浏览器时鼠标还没点到客服按钮就会自动缩回,实用效果完全打折 以下代 ...
- BZOJ1278: 向量vector(计算几何 随机化乱搞)
题意 题目链接 Sol 讲一下我的乱搞做法.... 首先我们可以按极角排序.然后对\(y\)轴上方/下方的加起来分别求模长取个最大值.. 这样一次是\(O(n)\)的. 我们可以对所有向量每次随机化旋 ...
- win7 x64 +vs2015 + cmake3.10.3编译opencv-3.4.1+opencv_contrib-3.4.1源码,并进行配置
简介: 一直以来都是在ubuntu下使用opencv,最近因为有<图像处理与模式识别>这门课,需要使用vs2015+opencv提交课程作业,因为opencv官方编译好的exe没有cont ...
- (网页)angularjs中的验证input输入框只能输入数字和小数点
百度的资料:自己记录看下 把js的验证方法改成angular可使用的方法 AngularJS文件的写法: $scope.clearNoNum = function(obj,attr){ //先把非数字 ...
- < meta http-equiv = "X-UA-Compatible" content = "IE=edge,chrome=1" />的意义
X-UA-Compatible是神马? X-UA-Compatible是IE8的一个专有<meta>属性,它告诉IE8采用何种IE版本去渲染网页,在html的<head>标签中 ...
- 自动化测试基础篇--Selenium Python环境搭建
学习selenium python需要的工具: 1.浏览器 2.Python 3.Selenium 4.FireBug(Firefox) 5.chromedriver.IEDriverServer.g ...
- 鸟哥的 Linux 私房菜Shell Scripts篇(三)
参考: http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#script_be http://www.runoob.com/lin ...
- cmder个人配置文件,做个记录
以下附件是自己的cmder配置文件: https://app.yinxiang.com/shard/s13/res/30e84035-5f0f-4baf-b18c-a84ce45ec8b9/wkkcm ...
- Emacs中使用shell(调出terminal)
在Emacs中使用shell(调出terminal) 方法: M-x eshell 注意:不能使用 M-x shell,这样调用的是 cmd命令,一些命令无法使用
- 【PAT】B1003 我要通过!
我觉得这是PAT中最坑的一道题,表述令人很不适应 分析过程: 条件1.只有P,A,T三种字符 条件2.xPATx正确,x可以是空串,或者由A组成的字符串 条件3.如果aPbTc是正确的,aPbATca ...