• rest_framework之频率详解 03


    访问频率(节流)

    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/

    三次访问以后

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

  • 相关阅读:
    web.py利用模板的详细步骤
    Arduino入门笔记(9):蓝牙模块及第一辆蓝牙遥控小车
    Python常用模块之sys
    使用Supervisor管理Linux进程
    Python socket聊天室程序
    Ubuntu 文件文件夹查看权限和设置权限
    python遍历目录
    linux tail命令的使用方法详解
    Python使用openpyxl读写excel文件
    python中enumerate()的用法
  • 原文地址:https://www.cnblogs.com/aaronthon/p/9256095.html
Copyright © 2020-2023  润新知