限流 Throttling

  • 限制'未登录用户'
from rest_framework.throttling import AnonRateThrottle
......
class TestView(APIView):
    # 取消登录/权限限制
    authentication_classes = []
    permission_classes = []
    # 限流
    throttle_classes = [AnonRateThrottle]

    def get(self,request,*args,**kwargs):
        ......
        return Response({'msg':'redis保存成功'},status=status.HTTP_200_OK)

## settings
......
# ---------DRF配置--------------------#
REST_FRAMEWORK = {
    ......
    # 限流,给谁限制
    "DEFAULT_THROTTLE_CLASSES": [
        # 全局配置,先注释掉
        # "rest_framework.throttling.AnonRateThrottle"
    ],
    # 限制要求:1分钟内只能访问3次
    "DEFAULT_THROTTLE_RATES": {
        'anon': '3/m'
    }
}

- 如果是全局配置,一样的套路,settings注释取消,视图类注释掉局部配置即可
  • 限制登录用户
class TestView(APIView):

    permission_classes = []

    def get(self,request,*args,**kwargs):
        ......
        return Response({'msg':'redis保存成功'},status=status.HTTP_200_OK)
......
# ---------DRF配置--------------------#
REST_FRAMEWORK = {
    ......
    "DEFAULT_THROTTLE_CLASSES": [
        # 限制登录用户
        "rest_framework.throttling.UserRateThrottle",
        # 匿名用户
        "rest_framework.throttling.AnonRateThrottle"
    ],
    # 限制要求
    "DEFAULT_THROTTLE_RATES": {
        # 登录用户
        'user': '6/m',
        # 匿名用户
        'anon': '3/m'
    }
}

- 如果此时访问接口,报错提示没有 is_authenticated 这个方法
  原因是,django框架的User模型有实现这个方法,而DRF节流视图调用了这个方法
  我们自定义的User模型却没有这个方法,补充即可
  ......
    # 用户
    class User(models.Model):
        ......
        # 补充(模仿源码即可)
        @property
        def is_authenticated(self):
            return True