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 @   Duosg  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示