DRF - 频率

频率组件


1.频率限制

访问频率的限制,可以进行对爬虫等恶意行为进行预防。

使用drf的频率限制对网站接口访问,只需要直接进行配置即可

2.频率认证步骤

(1)编写一个频率类,继承【频率模块】中的SimpleRateThrottle

  • 编写频率类,继承SimpleRateThrottle,也可以继承BaseThrottle但是要写的代码更加复杂
from rest_framework.throttling import BaseThrottle, SimpleRateThrottle

(2)重写get_cache_key方法,在源码中发现该方法需要两个参数request和view,来进行频率认证

(3)配置一个类属性:scope = 'xxx'

(4)在配置文件中配置:

DEFAULT_THROTTLE_RATES中,字典的键值需要和频率类中的scope的值对应

'DEFAULT_THROTTLE_RATES': {
      'xxx': '5/m', # m代表分, h代表时, d代表day
  }

(5)全局使用和局部使用

3.全局使用和局部使用

(1)局部权限:对单独的视图类生效

在视图类中,通过throttle_classes来进行限制认证

class BookDetailView(ViewSetMixin, RetrieveAPIView):
    """查询单个"""
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    "局部认证"
    throttle_classes = [CommonThrottle]

(2)全局权限:对于全局的视图类生效

settings.py在配置文件中配置

REST_FRAMEWORK = {
    # 【频率】的全局配置
    'DEFAULT_THROTTLE_CLASSES': [
        'app01.throttling.CommonThrottle'
    ],
    # 【频率限制】
    'DEFAULT_THROTTLE_RATES':
        {'book_5_m': '5/m'},
}

(3)全局权限 + 局部禁用

在全局的基础上,进行局部视图类的频率不进行校验

class BookDetailView(ViewSetMixin, RetrieveAPIView):
    # 列表为空,则为局部禁用
    throttle_classes = [] 

4.代码演示

throttling.py - 频率

# 编写频率类,继承SimpleRateThrottle,也可以继承BaseThrottle但是要写的代码更加复杂
from rest_framework.throttling import BaseThrottle,SimpleRateThrottle

# 频率类
class CommonThrottle(SimpleRateThrottle):
    # 类属性,属性值随便写
    # 配置文件中配置字典的键值需要与scope对应
    scope = 'xxx'
    # 重写 get_cache_key方法,该方法也有两个参数request, view
    def get_cache_key(self,request,view):
        # 1 对于用户访问频率的限制,可以通过ip 或者用户的id来判断
        #   用户客户端的ip地址,在asgi 的request.META 中可以找到,放在REMOTE_ADDR键值对中
        return request.META.get('REMOTE_ADDR')

views.py - 视图类中

在视图类中可以通过局部配置来控制是否进行频率校验

class BookDetailView(ViewSetMixin, RetrieveAPIView):
    """查询单个"""
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    
    "局部频率限制"
    throttle_classes = []

settings.py - 配置文件中

REST_FRAMEWORK = {
    # 【频率】的全局配置
    'DEFAULT_THROTTLE_CLASSES': [
        'app01.throttling.CommonThrottle'
    ],
    # 【频率限制】
    'DEFAULT_THROTTLE_RATES':
        {'xxx': '5/m'},
}
posted @ 2023-02-07 21:39  Duosg  阅读(24)  评论(0编辑  收藏  举报