• Django DRF限流组件


     
    

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

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

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

    二、全局配置,settings.py

    1. REST_FRAMEWORK = {
    2. # 限流全局配置
    3. "DEFAULT_THROTTLE_RATES":{
    4. "ip":"10/m",
    5. "user":"5/m",
    6. }
    7. }

    三、 局部应用,views.py

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

  • 相关阅读:
    Week 7 CNN Architectures - LeNet-5、AlexNet、VGGNet、GoogLeNet、ResNet
    防黑之攻击溯源·一颗优雅草科技健所写·渗透攻防站之攻击日志溯源,服务器日志溯源·反转查到黑客得工具
    SpringBoot电商项目之购物车下单(沙箱支付)
    什么是行内元素的盒模型
    【从入门到精通系列】-- MySQL(持续更新中……)
    tomcat线程模型
    手工架设安装教程:
    【前端特效】程序员给你的专属告白,快来转发给你心爱的那个她吧!
    如何组装一个注册中心?
    Java :职责链模式
  • 原文地址:https://blog.csdn.net/weixin_47401101/article/details/134543594