rest_framework之频率详解 03

访问频率(节流)

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

rest_framework之频率详解 03

rest_framework之频率详解 03

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

rest_framework之频率详解 03

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

rest_framework之频率详解 03

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

rest_framework之频率详解 03

rest_framework之频率详解 03

4.返回值True,则能访问

rest_framework之频率详解 03

rest_framework之频率详解 03

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

节流源码

1.

rest_framework之频率详解 03

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

rest_framework之频率详解 03

3.获取IP地址

rest_framework之频率详解 03

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

rest_framework之频率详解 03

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

rest_framework之频率详解 03

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

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

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

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

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

rest_framework之频率详解 03

被拒绝

rest_framework之频率详解 03

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

rest_framework之频率详解 03

运行结果

rest_framework之频率详解 03

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

rest_framework之频率详解 03

运行结果:

rest_framework之频率详解 03

 节流源码流程

1.

rest_framework之频率详解 03

2.

rest_framework之频率详解 03

3.

rest_framework之频率详解 03

 4.

rest_framework之频率详解 03

5.全局配置文件

rest_framework之频率详解 03

6.局部配置

rest_framework之频率详解 03

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

rest_framework之频率详解 03

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

rest_framework之频率详解 03

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

rest_framework之频率详解 03

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

rest_framework之频率详解 03

全局配置

rest_framework之频率详解 03

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

rest_framework之频率详解 03

全局配置settings.py里面

rest_framework之频率详解 03

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

1.源码:

rest_framework之频率详解 03

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

rest_framework之频率详解 03

3. class SimpleRateThrottle(BaseThrottle):

rest_framework之频率详解 03

 4.

rest_framework之频率详解 03

 SimpleRateThrottle:源码流程

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

rest_framework之频率详解 03

2.get_rate()  取scope的值。

rest_framework之频率详解 03

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

rest_framework之频率详解 03

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

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

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

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

rest_framework之频率详解 03

5.设置为每分钟3次

rest_framework之频率详解 03

6.rate = 3/m  获取到值

rest_framework之频率详解 03

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

rest_framework之频率详解 03

8.

rest_framework之频率详解 03

9.自己写get_cache_key方法

rest_framework之频率详解 03

10.继续源码

rest_framework之频率详解 03

11.缓存

rest_framework之频率详解 03

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

rest_framework之频率详解 03

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

rest_framework之频率详解 03

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

rest_framework之频率详解 03

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

rest_framework之频率详解 03

运行结果:

正常访问

rest_framework之频率详解 03

请求超过3次就抛异常。

rest_framework之频率详解 03

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

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

rest_framework之频率详解 03

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

rest_framework之频率详解 03

views.py

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

rest_framework之频率详解 03

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

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

rest_framework之频率详解 03

三次访问以后

rest_framework之频率详解 03

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