限流(访问频率)组件的使用

目录

  • 限流(访问频率)组件的使用

限流(访问频率)组件的使用

框架中限流功能的实现依赖于封装好的限流类,设置方式上分为全局设置和局部设置、继承类设置和自定义类设置。如果要实现限流功能则必须设置DEAFULRT_THROTTLE_CLASSES和DEAFULRT_THROTTLE_RATES

自定义限流类

  • 限流类的基本思路:
  1. 限流需要知道访问者的本地IP地址,通过地址才能进行记录访问次数;
  2. 限流需要了解访问者访问的时间,通过记录时间和次数来限制规定时间内访问者可以访问的频次;
  3. 拿到IP地址后,创建访问记录字段,IP作为key,value是有访问时的时间组成的列表,最近的访问时间排在列表的左侧,最早的访问时间排在列表的右侧,通过while循环,当最早的时间不符合规定的时间,通过pop()方法把最后一个从列表中剔除。
  4. 通过列表的长度来控制用户访问的次数,当满足要求是把用户访问的时间插入到列表的下标为0的位置。
  5. wait方法主要功能是返回距离下次可以正常访问的时间,注意返回值必须是数值,不能是字符串,基本思路是:需要用当前时间减去被剔除的访问时间得到的是刚过去多少时间,用限制的总时间再减去这个时间即可得到剩余限制时间。

    Note
    需要注意两点:

    1. 自定义的限流类中必须包含allow_request和wait方法,这两个方法名不能写错,否则系统无法运行。
    2. 获取IP地址的方法有两种:
    • 方式一: remote_addr = request._request.META.get(‘REMOTE_ADDR‘)
    • 方式二: remote_addr = request.META.get(‘REMOTE_ADDR‘)
  • 自定义限流类代码:

      # 设置同一个IP一分钟内只能访问三次的限流功能
      import time
      VISIT_RECORD = {}
      class VisitThrottle(object):
          def __init__(self):
              self.history = None
              self.ctime = None
              self.time = None
              # 变量默认为空
          def allow_request(self, request, view):
              remote_addr = request._request.META.get('REMOTE_ADDR')
              # 获取用户IP
              # 如果继承基类,那么这个remote_addr = self.get_indent(request),直接调用继承类中的方法
              ctime = time.time()
              self.ctime = ctime
              # 获取当前时间
              if not remote_addr in VISIT_RECORD:
                  VISIT_RECORD[remote_addr] = [ctime,]
                  # 不存在记录,创建记录
              history = VISIT_RECORD.get(remote_addr)
              self.history = history
              while history and history[-1] < ctime - 60:
                  history.pop()
                  # 距离当前时间超过一分钟的回自动剔除
              if len(history) <= 3:
                  history.insert(0, ctime)
                  return True
                  #返回True表示可以继续访问
    
          def wait(self):
              self.time = 60 - (self.ctime - self.history[-1])
              return self.time
              # 直接返回时间

全局设置的实现

--settings.py
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES':[
        'rest_framework.throttling.AnonRateThrottle',
        # 匿名用户的限流
        'rest_framework.throttling.UserRateThrottle'
        # 注册用户的限流
    }
    'DEFAULT_THROTTLE_RATES': {
        'anon': '2/minute',
        # 匿名用户每分钟限制访问次数为5次
        'user': '5/minute',
        # 注册用户每分钟限制访问次数为15次
    }
--views.py
# 全局限流功能的实现
class Demo5APIView(APIView):
    # 全局设置不需要在视图类中进行操作
    def get(self, request):
        # 投票页面
        return Response('这是投票页面')
--urls.py
    urlpatterns = [
        path('demo7/',views.Demo7APIView.as_view()),
        ]

局部设置的实现

--settings.py
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_RATES': {
        'anon': '2/minute',
        # 匿名用户每分钟限制访问次数为5次
        'user': '5/minute',
        # 注册用户每分钟限制访问次数为15次
    }
}
--views.py
# 局部限流功能的实现
class Demo6APIView(APIView):
    throttle_classes = [UserRateThrottle, AnonRateThrottle]
    # 局部设置需要写在视图函数中,以列表的形式来设置
    def get(self, reqeust):
        return Response('测试局部限流功能')
--urls.py
urlpatterns =[
     path('demo6/', views.Demo6APIView.as_view()),
   ]

自定义限流功能的实现

--settings.py
'DEFAULT_THROTTLE_CLASSES': [
    'rest_framework.throttling.ScopedRateThrottle',
    # 自定义限流需要用到的类
    ],

'DEFAULT_THROTTLE_RATES': {
    'contacts': '5/hour',
    # 自定义限流的速率设置
    }
}
    

自定义限流功能的实现

--views.py
from rest_framework.throttling import ScopedRateThrottle
class Demo7APIView(APIView):
   throttle_scope = 'contacts'
   # 通过throttle_scope来设置限流速率名称
   def get(self, request):
       return Response("测试自定义限流功能")
-- urls.py
urlpatterns = [
   path('demo7/', views.Demo7APIView.as_view()),
  ]

原文地址:https://www.cnblogs.com/ddzc/p/12129520.html

时间: 2024-08-29 14:42:40

限流(访问频率)组件的使用的相关文章

rest_framework组件之认证,权限,访问频率

共用的models 1 from django.db import models 2 3 4 # Create your models here. 5 6 7 class User(models.Model): 8 username = models.CharField(max_length=32) 9 password = models.CharField(max_length=32) 10 user_type = models.IntegerField(choices=((1, '超级用户'

限流、消峰的三种办法

互联网服务赖以生存的根本是流量, 产品和运营会经常通过各种方式来为应用倒流,比如淘宝的双十一等,如何让系统在处理高并发的同时还是保证自身系统的稳定,通常在最短时间内提高并发的做法就是加机器,但是如果机器不够怎么办?那就需要做业务降级或系统限流. 流量控制中用的比较多的三个算法就是令牌桶.漏桶.计数器. 1.令牌桶限流(TokenBucket)令牌桶算法的基本过程如下: 每秒会有 r 个令牌放入桶中,或者说,每过 1/r 秒桶中增加一个令牌. 桶中最多存放 b 个令牌,如果桶满了,新放入的令牌会被

rest-framework频率组件

throttle(访问频率)组件 1.局部视图throttle from rest_framework.throttling import BaseThrottle VISIT_RECORD={} class VisitThrottle(BaseThrottle): def __init__(self): self.history=None def allow_request(self,request,view): remote_addr = request.META.get('REMOTE_A

Django中rest_framework的认证组件,权限组件,频率组件,序列化组件的最简化版接口

url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.Login.as_view()), # Book表 url(r'^books/$',views.BookHandle.as_view({ 'get':'list', 'post':'create' })), url(r'^books/(?P<pk>\d+)/',views.BookHandle.as_view({ 'get':'retrieve

rest framework之限流组件

一.自定义限流 限流组件又叫做频率组件,用于控制客户端可以对API进行的请求频率,比如说1分钟访问3次,如果在1分钟内超过3次就对客户端进行限制. 1.自定义限流 假设现在对一个API访问,在30s内访问不能超过3次,应该如何实现? VISIT_RECORD = {} #定义全局变量,用于存放访问记录 class VisitThrottle(object): def __init__(self): #用于await计算剩余访问时间 self.history = None def allow_re

REST framework (组件使用之认证、权限、访问频率)

目录 一.认证 二.权限 三.限制访问频率 四.总结 一.认证(补充的一个点) 认证请求头 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 from rest_framework.views import APIView 4 from rest_framework.response import Response 5 from rest_framework.authentication import BaseAuthentication 6

【分布式架构】(10)---基于Redis组件的特性,实现一个分布式限流

分布式---基于Redis进行接口IP限流 场景 为了防止我们的接口被人恶意访问,比如有人通过JMeter工具频繁访问我们的接口,导致接口响应变慢甚至崩溃,所以我们需要对一些特定的接口进行IP限流,即一定时间内同一IP访问的次数是有限的. 实现原理 用Redis作为限流组件的核心的原理,将用户的IP地址当Key,一段时间内访问次数为value,同时设置该Key过期时间. 比如某接口设置相同IP10秒内请求5次,超过5次不让访问该接口. 1. 第一次该IP地址存入redis的时候,key值为IP地

SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级

源码地址:GitHub·点这里||GitEE·点这里 一.基本简介 1.概念描述 Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性.包括核心的独立类库,监控台,丰富的使用场景验证.(这似乎是阿里开源组件的一贯作风,极其有特点,且特点很规律) 基本特性图: 补刀一句:这种图很多人可能不在意,但是一般官方给这个图就是该中间件的基本使用思路,与核心功能点. 2.基础性概念 资源管理 资源是Sentinel组件中的核心概念之一.应用服务器上脚本,静态页面,A

控制ASP.NET Web API 调用频率与限流

ASP.NET MVC 实现 https://github.com/stefanprodan/MvcThrottle ASP.NET WEBAPI 实现 https://github.com/stefanprodan/WebApiThrottle   Refer: Throttling ASP.NET Web API calls http://blog.maartenballiauw.be/post/2013/05/28/Throttling-ASPNET-Web-API-calls.aspx