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 ...
随机推荐
- sql server: 最短路径
--------------------------------------------------------------------- -- Road System 道路 ------------ ...
- 如今领占主导地位的19种AI技术!
如今领占主导地位的19种AI技术! http://blog.itpub.net/31542119/viewspace-2212797/ 深度学习的突破将人工智能带进全新阶段. 2006 年-2015 ...
- Java 执行Shell脚本指令
一.介绍 有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本.而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且Runtime.getRu ...
- android系统通过图片绝对路径获取URI的三种方法
最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1.3的系统上都是可用的. 1.将所有的图片路径取出,遍历比较找到需要的路径 ...
- Python数据清洗基本流程
# -*- coding: utf-8 -*-"""Created on Wed Jul 4 18:40:55 2018 @author: zhen"" ...
- asp.net根据参数找不到记录后响应404及显示错误页
在asp.net mvc 中,action方法里根据参数获取数据,假如获取的数据为空,为了响应404错误页,我们可以return HttpNotFound(); 但是在asp.net webform中 ...
- Java概述和项目演示
Java概述和项目演示 1. 软件开发学习方法 多敲 多思考 解决问题 技术文档阅读(中文,英文) 项目文档 多阅读源码 2. 计算机 简称电脑,执行一系列指令的电子设备 3. 硬件组成 输入设备:键 ...
- [HDFS_4] HDFS 的 Java 应用开发
0. 说明 在 IDEA下 进行 HDFS 的 Java 应用开发 通过编写代码实现对 HDFS 的增删改查操作 1. 流程 1.1 在项目下新建 Moudle 略 1.2 为 Moudle 添加 M ...
- Centos7下安装与卸载docker应用容器引擎
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...
- openSUSE搭建OpenVPN
目录 openSUSE搭建OpenVPN 环境 安装openVPN服务端 安装easy-rsa工具 配置vars文件 创建服务端证书及key 创建客户端证书 疏理证书文件 服务端配置 启动openvp ...