5. DRF 限流
Django DRF 限流
1. 使用
1.1 设置认证全局变量
在settings.py添加如下代码
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES": ['utils.throttle.MineThrottle']
}
1.2 为单个视图方法设置权限
class Home2(APIView):
throttle_classes = [MineThrottle]
permission_classes = [MinePermission, MinePermission1, MinePermission2]
def check_permissions(self, request):
permission_result = []
for permission in self.get_permissions():
permission_result.append(permission.has_permission(request, self))
if True not in permission_result:
self.permission_denied(
request,
message=getattr(permission, 'message', None),
code=getattr(permission, 'code', None)
)
def get(self, reqeust):
return JsonResponse({"status": True, 'data': 'OK'})
def post(self, request):
print(request.user, request.auth)
return JsonResponse({"status": True, 'data': 'OK'})
1.3 限制用户一小时只能访问五次
throttling.py中还定义好了名字叫 SimpleRateThrottle的类,我们将要用这个类实现限制用户访问次数
下面看SimpleRateThrottle类中的allow_request方法
分析完成,现在开始写自己的代码
settings.py中设置
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ['utils.auth.Myauth'],
"DEFAULT_PERMISSION_CLASSES": ['utils.permission.MinePermission'],
"DEFAULT_THROTTLE_CLASSES": ['utils.throttle.MineThrottle'],
"DEFAULT_THROTTLE_RATES": {
"user": "5/m"
}
}
throttle.py中设置
from rest_framework.throttling import BaseThrottle, SimpleRateThrottle
class MineThrottle(SimpleRateThrottle):
scope = "user"
def get_cache_key(self, request, view):
if request.user:
ident = request.user.pk
else:
ident = self.get_ident(request)
return self.cache_format % {
'scope': self.scope,
'ident': ident
}
运行查看结果
连续运行五次后,
限流结束
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2023-07-12 路由分发admin源码
2023-07-12 答疑知识点