六、Drf限流组件

news2024/11/18 10:55:53

六、限流组件

限制某个视图在某个时间段内被同一个用户访问的次数

6.1限流组件的简单应用

1)安装django-redis

pip3 install django-redis

2)在settings.py中注册cache

#缓存数据库redis配置
CACHES={
    "default":{
        "BACKEND":"django_redis.cache.RedisCache",
        "LOCATION":"redis://"+redis_host+":"+redis_port,            #redis主机地址和端口,数据在local_settings中
        "OPTIONS":{
            "CLIENT_CLASS":"django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS":{
                "max_connections":1000,
                "encoding":"utf-8"
            },
            "PASSWORD":redis_password                                #redis密码,数据在local_settings中
        }
    }
}

3)编写限流类

#ext.throttle

from rest_framework.throttling import SimpleRateThrottle
from django.core.cache import cache as default_cache

class Mythrottle(SimpleRateThrottle):
    scope='xxx'                         #限流名称,可自定义
    #限流策略('xxx'是scope,'5/m'代表每份钟访问次数不超过5次,s:1,m:60,h:60*60,d:60*60*24)
    THROTTLE_RATES = {'xxx':'5/m'}
	#这个cache其实就是上面在settings.py中注册的redis
    cache = default_cache
    
    def get_cache_key(self, request, view):
        #获取唯一标识
        if request.user:
            #如果是已登入用户,ident取用户id
            ident=request.user.pk
        else:
            #如果是未登入用户,ident取用户IP
            ident=self.get_ident(request)
        #返回格式化以后的唯一标识
        return self.cache_format % {'scope':self.scope,'ident':ident}

3)在视图中应用限流

class LoginView(MyAPIView):
    #用户登入,不需要认证,不需要任何权限
    authentication_classes = []
    permission_classes = []

    #应用限流
    throttle_classes = [Mythrottle,]
    def post(self,request):
        name=request.data.get('name')
        password=request.data.get('password')
        print(name,password)
        user_obj=models.User.objects.filter(name=name,password=password).first()
        if not user_obj:
            #用户名密码错误
            return Response({'status':False,'errMsg':'用户名或密码错误'})
        token=str(uuid.uuid4())
        user_obj.token=token
        user_obj.save()


        return Response({'status':True,'token':token})

4)效果

在这里插入图片描述

5)全局配置

#settings.py
REST_FRAMEWORK = {
    
    'DEFAULT_THROTTLE_RATES':{'xxx':'5/m','ooo':'3/m'},
}
#限流类
class Mythrottle(SimpleRateThrottle):
    #这个scope的值,必须在全局配置中已定义
    scope='xxx'
    这个THROTTLE_RATES在限流类中就不需要写了
    # THROTTLE_RATES = {'xxx':'5/m'}

    cache = default_cache

    def get_cache_key(self, request, view):
        if request.user:
            ident=request.user.pk
        else:
            ident=self.get_ident(request)
        return self.cache_format % {'scope':self.scope,'ident':ident}

6.2自定义错误信息

限流的错误信息实际上写在rest_framework.exceptions.Throttled中

class Throttled(APIException):
    #错误信息
    status_code = status.HTTP_429_TOO_MANY_REQUESTS
    default_detail = _('Request was throttled.')
    extra_detail_singular = _('Expected available in {wait} second.')
    extra_detail_plural = _('Expected available in {wait} seconds.')
    default_code = 'throttled'

    def __init__(self, wait=None, detail=None, code=None):
        if detail is None:
            detail = force_str(self.default_detail)
        if wait is not None:
            wait = math.ceil(wait)
            detail = ' '.join((
                detail,
                force_str(ngettext(self.extra_detail_singular.format(wait=wait),
                                   self.extra_detail_plural.format(wait=wait),
                                   wait))))
        self.wait = wait
        super().__init__(detail, code)

因此我们只需要在执行限流时修改一下这里的错误信息即可

自定义一个类,继承APIView,并修改错误信息

from rest_framework import exceptions
from django.utils.translation import gettext_lazy as _
class MyAPIView(APIView):
    def __init__(self):
        exceptions.Throttled.default_detail = _('请求被限制,')
        exceptions.Throttled.extra_detail_singular = _('{wait}秒后可继续访问.')
        exceptions.Throttled.extra_detail_plural = _('{wait}秒后可继续访问.')

视图类继承上面创建的类MyAPIView

class LoginView(MyAPIView):
    #用户登入,不需要认证,不需要任何权限
    authentication_classes = []
    permission_classes = []

    #限流
    throttle_classes = [Mythrottle,]
    def post(self,request):
        name=request.data.get('name')
        password=request.data.get('password')
        print(name,password)
        user_obj=models.User.objects.filter(name=name,password=password).first()
        if not user_obj:
            #用户名密码错误
            return Response({'status':False,'errMsg':'用户名或密码错误'})
        token=str(uuid.uuid4())
        user_obj.token=token
        user_obj.save()


        return Response({'status':True,'token':token})

效果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2184241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI 对话工具汇总

🐣个人主页 可惜已不在 🐤这篇在这个专栏AI_可惜已不在的博客-CSDN博客 🐥有用的话就留下一个三连吧😼 目录 前言: 正文: 前言: 在科技飞速发展的时代,AI 对话正逐渐成为我们获取信息、交流思想的新方式。它以强…

Mysql(索引与事务)

索引查询与普通查询的区别 普通查询 :执行步骤为先对表进行遍历,然后把当前的行带入条件中进行判断,符合条件执行,不符合跳出。这种情况在遇见数据较多的情况下就会出现问题,效率太低。 索引查询:是对查询…

深入解析 https

我的主页:2的n次方_ 1. 背景介绍 在使用 http 协议的时候是不安全的,可能会出现运营商劫持等安全问题,运营商通过劫持 http 流量,篡改返回的网页内容,例如广告业务,可能会通过 Referer 字段 来统计是…

k8s的控制节点不能访问node节点容器的ip地址

master控制node服务器添加容器后,访问不了该node服务器容器的ip,只能在node服务器访问 排查后发现是k8s的master服务器和node节点的网址网段和k8s初始化时提示的ip网段不一致 我之前是192.168.137.50, 实际上master主机期望的是192.168.1.50 解决方案: 1.删除服务器后重建ma…

网络原理-TCP协议

回顾上文 上一篇博客中详细描述了UDP的报文格式及特点 UDP报头 UDP载荷(应用层数据报),源端口,目的端口,报文长度,校验和无连接,不可靠传输,面向数据报,全双工 这一篇…

新160个crackme - 071-Rith.1

运行分析 需要破解Name和Serial点击Check It!按钮没反应 PE分析 C程序,32位,无壳 静态分析&动态调试 ida搜索字符串,双击进入关键函数 进行动态调试,逻辑如下:1、Name长度为5~20,Serial长度…

算法笔记(三)——前缀和算法

文章目录 一维前缀和二维前缀和寻找数组的中心下标除自身以外数组的乘积和为 K 的子数组和可被 K 整除的子数组连续数组矩阵区域和 前缀和算法是一种用空间换时间的算法,他常常用于解决某些题目或者作为某些高级算法的组成部分 一维前缀和 题目链接:DP3…

【最新】微信小程序连接onenet——stm32+esp8266+onenet实现查看温湿度,控制单片机

微信小程序——stm32esp8266onenet实现查看温湿度,控制单片机 (最新已验证)stm32 新版 onenet dht11esp8266/01s mqtt物联网上报温湿度和控制单片机(保姆级教程) :↓↓👇 👇 👇 &#x1f447…

【Linux】进程优先级、调度、命令行参数:从理论到实践(二)

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 🚀 前言一: 🔥 进程优先级 🍵 基本概念🍵 查看系统进程🍵 PRI and NI🍵 PRI vs NI🍵 用to…

【Java SE 题库】移除元素(暴力解法)--力扣

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 题目 2. 解法(快慢“指针”) 3. 源码 4. 小结 1. 题目 给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素。元素的顺…

Pre-trained Models for Natural Language Processing: A Survey

前言 预训练模型给下游任务带来的效果不言而喻,有了预训练模型,我们可以使用它来加速解决问题的过程。正如论文中所说的那样,预训练模型(PTMs)的出现将自然语言处理(NLP)带入了一个新时代。本篇…

各种饺子的做法

【羊肉馅水饺】 材料:羊肉1000克、洋葱2个、香油3汤匙、盐适量、姜2片、料酒1汤匙、白胡椒粉、十三香1茶匙、 做法: 1.把羊肉剁成肉馅,羊肉选用带一些肥肉的,味道比较香,如果羊肉比较瘦,可以放一些猪的肥肉一起剁成馅…

【Python】探索自然语言处理的利器:THULAC 中文词法分析库详解

THULAC(THU Lexical Analyzer for Chinese)是清华大学开发的一款中文词法分析工具,集成了分词和词性标注两大功能。THULAC 拥有强大的分词能力和高效的词性标注,适用于多种中文文本处理场景。该工具能够在保证高准确率的同时保持较…

修复OpenSSH远程代码执行漏洞:版本升级到9.9p1

目录 前言1. 备份配置文件2. 下载 OpenSSH 最新版本3. 编译安装 OpenSSH4. 替换旧版 OpenSSH 并创建符号链接5. 重启 SSH 服务6. 验证安装结果结语参考文章 前言 OpenSSH 是一种广泛使用的远程登录协议,它确保了服务器和客户端之间的安全通信。然而,随着…

Linux驱动开发(速记版)--设备树

第五十二章 初识设备树 52.1 设备树介绍 设备树(Device Tree)是嵌入式系统和Linux内核中用于描述硬件的一种机制。 设备树概述 目的:描述硬件设备的特性、连接关系和配置信息。 优势:与平台无关,提高系统可移植性和可…

【linux进程】进程优先级命令行参数环境变量

目录 一,进程切换二,进程优先级1. 什么是优先级2. 权限 vs 优先级3. 为什么要有优先级4. 优先级的查看方式 三,命令行参数1. 什么是命令行参数2. 为什么要有命令行参数3. 是谁做的 四,环境变量1. 基本概念2. 常见环境变量3. 查看环…

电商店铺多开自动回复软件

在电商平台上开设多个店铺,即店铺多开,是一种扩展业务和增加销售额的策略。然而,店铺多开需要谨慎规划和执行,以避免违反平台规定和管理上的混乱。以下是如何实现店铺多开的详细步骤和注意事项。 1. 确定多开目标 在决定多开店铺…

[云] Getting Started with Kubernetes - Environment setup 环境配置

启动一个 EC2 实例, 请按照以下步骤操作: 登录 AWS 控制台: 打开浏览器,访问 AWS Management Console 并登录到您的账户。 选择 EC2 服务: 在 AWS 控制台的“服务”菜单中找到并点击“EC2”进入 EC2 Dashboard。 启…

Spark SQL分析层优化

导读:本期是《深入浅出Apache Spark》系列分享的第四期分享,第一期分享了Spark core的概念、原理和架构,第二期分享了Spark SQL的概念和原理,第三期则为Spark SQL解析层的原理和优化案例。本次分享内容主要是Spark SQL分析层的原理…

国内车牌号检测数据集 7800张 车牌识别 带标注 voc yolo

车牌号检测数据集 7800张 车牌识别 带标注 voc yolo 车牌号码检测数据集 名称 车牌号码检测数据集 (License Plate Detection Dataset) 规模 图像数量:7800张图像。类别:无分类,主要针对车牌区域的定位。标注个数:10,000多个标…