当前位置: 首页 > news >正文

Django DRF限流组件

 

在DRF中,限流发生在认证、权限之后,限流组件的使用步骤: 1、编写自定义限流类; 2、在settings.py中配置redis; 3、安装django-redis; 4、启动redis服务; 5、局部应用,一般是在核心的视图中使用,不会全局使用。限流组件的应用案例如下:

一、自定义限流类,throttle.py,设计了 2个限流类,一个是针对匿名用户的限流,匿名用户的唯一标识选择IP地址;一个针对登录用户的限流,登录用户的唯一标识是用户名。

from rest_framework.throttling import SimpleRateThrottle
from django.core.cache import cache as default_cache# 限流组件,匿名用户访问,没有登录的用户,肯定是没有user的,直接获取IP地址
class IpThrottle(SimpleRateThrottle):scope = "ip"# 局部配置,一分钟访问10次;也可以配置到全局;# THROTTLE_RATES = {"ip": "10/m"}cache = default_cache  # default_cache 会读取配置文件中redis缓存的配置def get_cache_key(self, request, view):# 获取请求用户的IP地址(去request中找请求头)ident = self.get_ident(request)return self.cache_format % {'scope': self.scope, 'ident': ident}# 限流组件,用户限流类
class UserThrottle(SimpleRateThrottle):scope = "user"# 局部配置,一分钟访问5次;也可以配置到全局;# THROTTLE_RATES = {"user": "5/m"}cache = default_cache  # default_cache 会读取配置文件中redis缓存的配置def get_cache_key(self, request, view):ident = request.user.pk  #用户IDreturn self.cache_format % {'scope': self.scope, 'ident': ident}

二、全局配置,settings.py

REST_FRAMEWORK = {# 限流全局配置"DEFAULT_THROTTLE_RATES":{"ip":"10/m","user":"5/m",}
}

三、 局部应用,views.py

from ext.throttle import IpThrottle,UserThrottleclass LoginView(APIView):# login页面不需要认证就可以登录,所以单独设置为空;authentication_classes = []permission_classes = []# 应用限流组件,使用IP限流throttle_classes = [IpThrottle,]def post(self,request):# 1、接收用户提交的用户名和密码;user = request.data.get("username")pwd = request.data.get("password")# 2、数据库校验;user_object = models.UserInfo.objects.filter(username=user,password=pwd).first()if not user_object:return Response({"status":False,"msg":"用户名或者密码错误"})# 用户名密码正确为用户生产tokentoken = str(uuid.uuid4())user_object.token = tokenuser_object.save()return Response({"status":True,"msg":"登录成功!","token":token})class AvatarView(NbApiView):# 老板或者员工可以访问permission_classes = [UserPermission,BossPermission]# 对登录用户使用登录用户限流throttle_classes = [UserThrottle,]def get(self,request):return Response({"status":True,"data":[11,22,33,44]})

http://www.lryc.cn/news/238708.html

相关文章:

  • UEC++ day7
  • win11,安装python,pip,和opencv
  • kafka入门(一):kafka消息发送与消费
  • CMap数据库筛选化学药物
  • mysql命令行(mysql-client)连接数据库
  • sklearn中的TfidfTransformer和gensim中的TfidfModel的区别
  • spring注解
  • SpringCloud实用篇02
  • Nginx快速入门教程,域名转发、负载均衡
  • ElasticSearch之健康状态
  • java io流中为什么使用缓冲流就能加快文件读写速度
  • 【鸿蒙最新全套教程】<HarmonyOS第一课>1、运行Hello World
  • 求二叉树中指定节点所在的层数(可运行)
  • Ubuntu18 Opencv3.4.12 viz 3D显示安装、编译、移植
  • EPSon打印机更换色带
  • 电脑游戏录屏软件,记录游戏高光时刻
  • Hadoop性能调优建议
  • 算法的奥秘:常见的六种算法(算法导论笔记2)
  • Python算法——树的路径和算法
  • 数据结构之链表练习与习题详细解析
  • QT中使用unity
  • QTableView/QTableWidget设置单元格字体颜色及背景色
  • 电脑上可以写便签的软件哪些界面比较可爱且好用?
  • 2021秋招-总目录
  • HTML5生成二维码
  • 大数据-之LibrA数据库系统告警处理(ALM-25005 Nscd服务异常)
  • NLP:使用 SciKit Learn 的文本矢量化方法
  • 这些仪表板常用的数据分析模型,你都见过吗?
  • 【Proteus仿真】【Arduino单片机】多功能数字时钟设计
  • c语言回文数