六、Drf限流组件

devtools/2024/10/9 2:23:32/

六、限流组件

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

6.1限流组件的简单应用

1)安装django-redis

pip3 install django-redis

2)在settings.py中注册cache

python">#缓存数据库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)编写限流类

python">#ext.throttlefrom rest_framework.throttling import SimpleRateThrottle
from django.core.cache import cache as default_cacheclass 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中注册的rediscache = default_cachedef get_cache_key(self, request, view):#获取唯一标识if request.user:#如果是已登入用户,ident取用户idident=request.user.pkelse:#如果是未登入用户,ident取用户IPident=self.get_ident(request)#返回格式化以后的唯一标识return self.cache_format % {'scope':self.scope,'ident':ident}

3)在视图中应用限流

python">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=tokenuser_obj.save()return Response({'status':True,'token':token})

4)效果

在这里插入图片描述

5)全局配置

python">#settings.py
REST_FRAMEWORK = {'DEFAULT_THROTTLE_RATES':{'xxx':'5/m','ooo':'3/m'},
}
python">#限流类
class Mythrottle(SimpleRateThrottle):#这个scope的值,必须在全局配置中已定义scope='xxx'这个THROTTLE_RATES在限流类中就不需要写了# THROTTLE_RATES = {'xxx':'5/m'}cache = default_cachedef get_cache_key(self, request, view):if request.user:ident=request.user.pkelse:ident=self.get_ident(request)return self.cache_format % {'scope':self.scope,'ident':ident}

6.2自定义错误信息

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

python">class Throttled(APIException):#错误信息status_code = status.HTTP_429_TOO_MANY_REQUESTSdefault_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 = waitsuper().__init__(detail, code)

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

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

python">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

python">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=tokenuser_obj.save()return Response({'status':True,'token':token})

效果:

在这里插入图片描述


http://www.ppmy.cn/devtools/123146.html

相关文章

【word脚注】双栏设置word脚注,脚注仅位于左栏,右栏不留白

【word脚注】双栏设置word脚注,脚注仅位于左栏,右栏不留白 调整前效果解决方法调整后效果参考文献 调整前效果 调整前:脚注位于左下角,但右栏与左栏内容对其,未填充右下角的空白区域 解决方法 备份源文件复制脚注内…

【堆排】为何使用向下调整法建堆比向上调整法建堆更好呢?

文章目录 前言一、堆排代码一、计算使用向上调整法建堆的时间复杂度二、计算使用向下调整法插入的时间复杂度总结 前言 在博主的上一篇博客堆排(链接在这里点击即可)的总结中提出啦使用向下调整法建堆比使用向上调整法建堆更好,是因为使用向上调整法建堆的时间复杂…

SimpleFoc以及SVPWM学习补充记录

SimpleFoc SimpleFOC移植STM32(一)—— 简介 FOC控制的过程是这样的: 对电机三相电流进行采样得到 Ia,Ib,Ic。将 Ia,Ib,Ic 经过Clark变换得到 I_alpha I_beta。将 I_alpha I_beta 经过Park变换得到 Id,Iq。计算 Id,Iq 和其设定值 Id_ref 和…

gbase8s数据库实现黑白名单的几种方案

1、借用操作系统的黑白名单 2、使用数据库 TRUSTED CONTEXT 机制 CREATE TRUSTED CONTEXT tcx1USER rootATTRIBUTES (ADDRESS 172.16.39.162)ATTRIBUTES (ADDRESS 172.16.39.163)ENABLEWITH USE FOR wangyx WITHOUT AUTHENTICATION; 如上创建 可信任上下文对象 tcx1 在 jdb…

Java访问器方法和更改器方法

一.访问器方法 1.访问器方法的定义和用途 访问器方法,通常也称为getter方法,是一种在面向对象编程中用于从类的外部访问私有字段值的特殊方法。这些方法的设计目的是为了提供对类内部状态的受限访问,同时保持类的封装性。通过使用访问器方法&…

人力资源管理软件推荐,8款顶尖产品盘点

多款人力资源管理软件各具特色,适用于不同规模企业。ZohoPeople全面、安全、智能,Workday云端综合,OracleHCMCloud适合跨国企业,Moka、北森、薪人薪事、欢雀HR等各有优势,企业应根据需求选择并试用。 一、Zoho People …

大数据算法的思维

大数据算法的分类 一、分类算法 1. 决策树算法:通过构建树状结构,对数据进行分类。例如 ID3、C4.5 和 CART 算法,它们根据不同的特征选择标准进行分支划分,最终形成一颗能够对新数据进行分类的决策树。 2. 支持向量机&#xff08…

ThreadLocal原理解析及面试

基本使用 讲原理之前&#xff0c;我简单写个demo小程序说说怎么使用 public class TestThreadLocal {public static void main(String[] args) throws InterruptedException {ThreadLocal<String> tl new ThreadLocal();/**主线程设置了一个值*/tl.set("SSSSSs&…