【DRF频率】 -- 2019-08-08 20:39:51

目录

  • 使用自带的频率限制类
  • 使用自定义的频率限制类

原文: http://106.13.73.98/__/67/

开发平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用.

DRF就为我们提供了一些频率限制的方法.
DRF中的版本、认证、权限、频率组件的源码是一个流程,且频率组件在最后执行.

@
***

DRF频率组件原理
·
DRF中的频率控制基本原理是基于访问次数和时间的,当然我们也可以通过自己定义的方法来实现.
当请求进来,走到我们的频率组件时,DRF内部会有一个字典来记录访问者的IP.
以这个字典的IP为key,value为一个列表,存放访问者每次访问的时间:{PI1: [第三次访问时间, 第二次访问时间, 第一次访问时间, ]}
把每次访问的最新时间放入列表的最前面,记录这样一个数据结构后,通过如下方式限制:
·
如果我们设置的是10秒内只能访问5次:

  1. 判断访问者的IP是否在这个请求IP的字典里.
  2. 保证这个列表里都是都是最近10秒内访问的时间.
    : 判断当前请求时间和列表里最早的(也就是最后一个)请求时间差
    : 如果差大于10秒,说明请求不是最近10秒内的,删除掉最后一个
    : 继续判断倒数第二个、第三个,直到差小于10秒为止
  3. 判断列表的长度(即访问次数)是否大于我们设置的5次.
    : 如果大于,则限制其访问
    : 如果小于,则放行,并把时间记录到列表的最前面
    ***

使用自带的频率限制类

首先 配置频率限制类

from rest_framework.throttling import SimpleRateThrottle  #  导入内置的频率限制类

class DRFThrottle(SimpleRateThrottle):
    """注意:这里都是必备的属性、方法和返回值"""
    scope = 'WD'
    def get_cache_key(self, request, view):
        # 拿IP地址
        return self.get_ident(request)

然后 配置文件

REST_FRAMEWORK = {
    # 指定频率限制的类
    "DEFAULT_THROTTLE_CLASSES": ['blog.throttle.DRFThrottle'],
    # WD是scope定义的值,3/m表示每分钟不能超过3次访问
    "DEFAULT_THROTTLE_RATES": {"WD": "3/m"},
}

"""
如果只是想给单个视图做频率限制:
则删除这里的"DEFAULT_THROTTLE_CLASSES"配置项
并在要做频率限制的视图中指定频率限制类即可
指定语法:throttle_classes = ["频率限制类", ]
"""

开始测试

访问测试页面,连续刷新3次后,可看到:

***

使用自定义的频率限制类

首先 自定义频率限制类

import time

VISIT_RECORD = {}  # 限制访问次数的字典

class MyThrottle():
    """
    自定义频率限制类,一分钟允许访问5次
    注意:自定义频率限制类中必须要有allow_request和wait方法
    前者用于频率限制的逻辑,后者用于返回限制时间还剩多少秒
    """

    def __init__(self):
        self.history = []

    def allow_request(self, request, view):
        """用于限制访问的逻辑"""
        # 获取用户的IP地址
        ip = request.META.get('REMOTE_ADDR')
        if ip not in VISIT_RECORD:
            VISIT_RECORD[ip] = [time.time(), ]
        else:
            history = VISIT_RECORD[ip]
            self.history = history
            history.insert(0, time.time())
            # 确保访问时间在允许范围之内
            while self.history[0] - self.history[-1] > 60:
                self.history.pop()
            # 确定访问次数在允许的范围内
            if len(self.history) >= 5:
                return False
        return True

    def wait(self):
        """用于返回限制时间还剩多少秒"""
        return 60 - (self.history[0] - self.history[-1])

然后 配置文件

REST_FRAMEWORK = {
    # 指定自定义的频率限制类
    "DEFAULT_THROTTLE_CLASSES": ['blog.throttle.MyThrottle'],
}

> """
如果只是想给单个视图做频率限制:
则删除这里的"DEFAULT_THROTTLE_CLASSES"配置项
并在要做频率限制的视图中指定频率限制类即可
指定语法:throttle_classes = ["频率限制类", ]
"""

好了,就到这里吧.

原文: http://106.13.73.98/__/67/

原文地址:https://www.cnblogs.com/gqy02/p/11323681.html

时间: 2024-10-04 12:34:36

【DRF频率】 -- 2019-08-08 20:39:51的相关文章

2014/08/08 – Backbonejs

[来自: Backbone.js 开发秘笈 第5章] Event API: (function ($) { //define ------------------------- var obj = {}; var obj2 = { commonEvent: function () { window.document.title = new Date().toString(); } }; //扩展对象包含事件 _.extend(obj, Backbone.Events); _.extend(obj

【DRF频率】 񱆴

目录 使用自带的频率限制类 使用自定义的频率限制类 原文: http://blog.gqylpy.com/gqy/292 "开发平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. DRF就为我们提供了一些频率限制的方法. DRF中的版本.认证.权限.频率组件的源码是一个流程,且频率组件在最后执行. @ *** DRF频率组件原理 · DRF中的频率控制基本原理是基于访问次数和时间的,当然我们也可以通过自己定义的方法来实现. 当请求进来,走到我们的频率组件时,DRF内部会有

2019/09/08最新进展

今日完成的工作如下: 1.继续完善论文: 2.发现仿真数据出错了,原来是公式有个地方出错了... 修改后的公式为: (1)      当t1<=2.5s,v=v2 (2)      当2.7s > t1 >2.5s,v = v2 – ug(t^2)/0.4|t=t1-2.5 (3)      当t1>2.7s,  v’=v2-ug(0.2*0.2)-(v1/(ug)+0.1-2.7)*ug 3.根据公式进行仿真.写一个cpp: #include<bits/stdc++.h&g

2019.04.08打卡

1 #include <stdio.h> 2 #include <stdlib.h> 3 typedef int DataType; 4 typedef struct node{ 5 DataType data; 6 struct node *next; 7 }LinkNode,*LinkList; //LinkNode是JAVA中链表结点,此类可以存放int.long.float.double.byte.short.String.StringBuffer类型的数据 8 //定义单

2019.10.08考试报告

T1 用一个堆维护最小的是谁,每次加入一个值x时查询堆顶是否小于x,有则买top卖x,之后分为是不是反悔操作判断要不要把pop. 然而好像其他人都push两个来进行反悔操作. 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<queue> 6 #define int long long 7 using namespace

PAT 甲级 A1019 (2019/02/08)

1 #include<cstdio> 2 bool Judge(int A[], int num){ 3 for(int i = 0; i < num; i++){ 4 if(A[i] == A[num-1-i]) 5 return true; 6 else 7 return false; 8 } 9 } 10 int main(){ 11 int N, b, A[40], num = 0; 12 scanf("%d %d", &N, &b); 13

PAT 甲级 A1027 (2019/02/08)

1 #include<cstdio> 2 int main(){ 3 char str[13] = {'0','1','2','3','4','5','6','7','8','9','A','B','C'}; 4 int a, b, c; 5 scanf("%d %d %d", &a, &b, &c); 6 printf("#"); 7 printf("%c%c",str[a/13], str[a%13]);

2019 08 08 字符编码,文件操作

字符编码 一.计算机基础 cpu: 控制程序的运行(从内存中取出文本编辑器的数据读入内存) 内存: 运行程序(经cpu操作后,内存中含有文本编辑器的数据) 硬盘: 存储数据(文本编辑器) 二.文本编辑器存取文件的原理 ? 计算机只认识 0和1 ? 文本编辑器的作用: 读写数据,保存数据 打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放与内存中的,断电后数据丢失. 要想永久保存,需要点击保存按钮:编辑器把内存的数据刷到了硬盘上. 在我们编写一个py文件(没有执行)

2019 08 08 文件高级应用和函数基础

文件的高级应用 可读.可写 r+t: 可读.可写 即可读又可写(尽量不要使用) # r+ 是在后面追加 w+t: 可写.可读 清空文件的功能是w提供的, w+更不要使用 a+t: 可追加.可读 a有追加的功能,a的指针在末尾,a+功能也没用 # wt with open('36w.txt', 'wt', encoding='utf-8') as fw: print(fw.readable()) print(fw.writable()) False True # w+t with open('36