访问频率(节流)

1.某个用户一分钟之内访问的次数不能超过3次,超过3次则不能访问了,需要等待,过段时间才能再访问。

2.自定义访问频率。两个方法都必须写上。

登入页面的视图加上访问频率

3.返回值False,则不能访问

4.返回值True,则能访问

上面的节流太简单粗暴了,接下来加上一些判断。先获取用户IP

节流源码

1.

2.remote_addr = request.META.get('REMOTE_ADDR')  获取IP地址

3.获取IP地址

4.print(remote_addr)   打印用户的ID

5.保存用户的所有记录,先定义一个全局的变量。(可以放数据库、缓存)

6.为了逻辑更清晰,我们让时间近的,放到列表的最前面(就是列表的左端)。

只要访问时间超过一分钟,我们就删掉他。

如果一分钟内已经访问三次了,第四次访问时就会被拒绝。

等到最早的一个访问时间超过一分钟被删掉,就可以继续访问了。

用while循环,可以把所有过期的时间都删掉。

被拒绝

7.wait方法:提示需要等待多少秒才能访问。

运行结果

8.等待时间不能写死,应该的动态的。

运行结果:

节流源码流程

1.

2.

3.

4.

5.全局配置文件

6.局部配置

7.check_throttles 方法执行每一个节流的 allow_request方法。

8.allow_request 如果返回的False,则抛出异常。

9.超出访问次数,抛出异常。

10.wait 把提示时间拿到,还剩多少秒。

全局配置

把访问频率的类放到app01.utils.throttle.py文件里

全局配置settings.py里面

内置控制频率类  from rest_framework.throttling import BaseThrottle

1.源码:

2.继承内置控制频率类。

3. class SimpleRateThrottle(BaseThrottle):

4.

SimpleRateThrottle:源码流程

1.请求一进来先执行构造方法。__init__()

2.get_rate()  取scope的值。

3.THROTTLE_RATES  去全局配置文件取值

4.配置全局文件settings.py.

接下来我们定义一个30秒访问10次的频率。

setting.py文件写一条配置。内部有自动实现30秒10次!!!

如果是我们自己写的,就必须改源码。内置的只要传参即可。

5.设置为每分钟3次

6.rate = 3/m  获取到值

7.进行分割rate,分别那种次数、时间

8.

9.自己写get_cache_key方法

10.继续源码

11.缓存

12.符合条件,访问成功,返回True

13.访问次数太多,返回False ,不能访问。

14.提示时间也给我们写好了,不用自己写。

15.所以4行代码就搞定啦,再加上配置。

运行结果:

正常访问

请求超过3次就抛异常。

问题:能不能让当前登入用户也做这样的操作?

1.对登入用户的控制访问频率。

2.setting.py  已登入的用户10/m

views.py

登入api 局部设置(单独设置) 匿名访问频率 3/m. 其他api都默认用全局的。

运行结果:OrderView订单api 、UserInfoView用户信息api 都是默认用全局已登入访问频率的配置。匿名用户3/m,超过3次就不能再访问啦。

http://127.0.0.1:8011/app01/v1/auth/

三次访问以后

已登陆用户访问的就不写了,自己悟,很简单。

rest_framework之频率详解 03的更多相关文章

  1. django rest_framework 序列化组件详解

    为什么要用序列化组件 当我们做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到 ...

  2. rest_framework之序列化详解 06

    拿到所有的角色数据 1.urls.py 2.models.py  假设只有3个角色 3.views.py from api import models import json json只能序列化pyt ...

  3. rest_framework之版本详解 04

    访问不同版本,给不同内容. rest规范:版本要么放url上:要么放请求头里. 1.原来的url的版本都写死了.只能写v1 from django.conf.urls import url from ...

  4. rest_framework之规范详解 00

    接口开发 方式1:缺点:如果有10张表,则需要40个url. urls.py views.py 缺点:如果有10张表,则需要40个url.    接下来就出现了resrful 规范,比较简洁 方式2: ...

  5. 21个项目玩转深度学习:基于TensorFlow的实践详解03—打造自己的图像识别模型

    书籍源码:https://github.com/hzy46/Deep-Learning-21-Examples CNN的发展已经很多了,ImageNet引发的一系列方法,LeNet,GoogLeNet ...

  6. 小甲鱼PE详解之IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用(PE详解03)

    咱接着往下讲解IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用! (视频教程:http://fishc.com/a/shipin/jiemixilie/) 接着我们来谈谈 IM ...

  7. IO模型(epoll)--详解-03

    写在前面 epoll是开发linux高性能服务器的必备技术至,epoll本质,是服务端程序员的必须掌握的知识. 七.epoll的原理和流程 本节会以示例和图表来讲解epoll的原理和流程. 创建epo ...

  8. RFC2544学习频率“Learning Frequency”详解—信而泰网络测试仪实操

    在RFC2544中, 会有一个Learning Frequency的字段让我们选择, 其值有4个, 分别是learn once, learn Every Trial, Learn Every Fram ...

  9. 【转】小波与小波包、小波包分解与信号重构、小波包能量特征提取 暨 小波包分解后实现按频率大小分布重新排列(Matlab 程序详解)

    转:https://blog.csdn.net/cqfdcw/article/details/84995904 小波与小波包.小波包分解与信号重构.小波包能量特征提取   (Matlab 程序详解) ...

随机推荐

  1. Error -27740: WSA_IO_pending

    Error -27740: WSA_IO_pendingAction.c(198): Error -27791: Server **** has shut down the connection pr ...

  2. 数据库 Oracle监听实例详解

    Oracle实例别名 IMCDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = )) (CONNECT_D ...

  3. Hash表的表大小

    hash表的出现主要是为了对内存中数据的快速.随机的访问.它主要有三个关键点:Hash表的大小.Hash函数.冲突的解决. 这里首先谈谈第一点:Hash表的大小. Hash表的大小一般是定长的,如果太 ...

  4. struts2中struts.xml和web.xml文件解析及工作原理

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp ...

  5. 25个非常实用的jQuery/CSS3应用组件

    今天分享25款功能十分强大的jQuery/CSS3应用插件,欢迎收藏. 1.jQuery水晶样式下拉导航 这是一款非常不错的jQuery多功能下拉菜单插件,菜单外观呈水晶样式,晶莹剔透,功能丰富,包含 ...

  6. linux -- Ubuntuserver图形界面下安装、配置lampp、phpmyadmin

    PHP开发和服务器运行环境首选LAMP组合,即Linux+Apache+Mysql+Php/Perl/Python,能最优化服务器性能.如何在本地电脑Ubuntu 中安装和配置LAMP环境搭建?Ubu ...

  7. 启动vsftpd失败

    启动vsftpd失败 在使用centos时, 要用ftp上传文件, 但是一到脚本的ftp命令就会出错: rpm -Uvh http://mirror.centos.org/centos/6/os/i3 ...

  8. 3D游戏与计算机图形学中的数学方法-视截体

    视截体用来表示一个空间的范围,位于这个空间范围内的三维场景的任何物体都可以被看到. 视截体由六个平面围成,其中的四个平面与场景的边界相对应,分别被称为左,右,底,顶视截面.另外两个平面称为近视截面和远 ...

  9. 获取作为 URL 部署清单的位置。

    ActivationContext ac = AppDomain.CurrentDomain.ActivationContext; ApplicationIdentity ai = ac.Identi ...

  10. 【java 类加载的深入研究1】loadClass()的研究

    1.开门见山 以前曾经看到过一个java的面试题,当时觉得此题很简单,可是自己把代码运行起来,可是结果并不是自己想象的那样.题目如下: class SingleTon { private static ...