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'},
}