169. 基于Django-RESTFramework的节流的使用

1.节流概述

节流又称限流,限制访问。
就是一个用户多次发送一个请求(页面或者链接)的时候,单位时间允许访问次数限制,超过限制就会出现访问受限,提示譬如:离下一场访问还有多久之类等的字样。

2.自定义节流

说明

  • 两个类,都继承SimpleRateThrottle类,因为该类实现了很多通用的节流功能
  • 都必须实现get_cache_key方法,返回该类用于节流的key(需要确保能够区分每个请求用户),
    • AnonymousThrottle的get_cache_key:获取的请求的IP
    • UserThrottle的get_cache_key:登录用户的用户名
  • scopre: 节流配置的key,用于在配置中对应DEFAULT_THROTTLE_RATES的配置
  • cache:默认使用django项目配置的default缓存保存客户端识别的信息,如果没有配置就保存在内存中
  • 都是通过SimpleRateThorttle类的allow_request(self,request,view)方法做的限制,可以自定义方法进行覆盖,该方法返回boolean值
    创建py文件
# rest_app/app_throttles.py 节流的使用
from rest_framework.throttling import SimpleRateThrottle

class AnonymousThrottle(SimpleRateThrottle):
    # 如果有配置了多个缓存,默认使用'default',可以通过cache属性指定
    # cache = caches['alternate']
    scope = 'annonymous'
    def get_cache_key(self, request, view):
        return self.get_ident(request)# 获取ip
    

class UserThrottle(SimpleRateThrottle):
    scope = 'user'
    def get_cache_key(self, request, view):
        return request.user.username # 获取用户名

settings.py

REST_FRAMEWORK = {
    # 自定义节流类
    "DEFAULT_THROTTLE_CLASSES":["rest_app.app_throttles.UserThrottle"],# 配置默认的节流类,列表,路由配置多个
    # 节流频率的规则,字典,key时第一步中节流类的scope属性,值是5/m
    "DEFAULT_THROTTLE_RATES": {
        "anonymous": '5/m',# 名称:次数/单位时间
        "user": '10/m',
   }
}

在这里插入图片描述
对视图指定节流类

class StudentsView(generics.ListCreateAPIView):
    # 指定需要操作的数据与序列化类
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    # 添加身份验证功能
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

    # 标识匿名用户访问
    throttle_classes = [app_throttles.AnonymousThrottle]
    
    # 重写新增方法,在保存Student时候关联用户
    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)
         

在这里插入图片描述
针对视图函数的创建,也可以使用装饰器的方式进行标识

3.内置节流类

urls

REST_FRAMEWORK = {
    # 默认的验证是按照验证列表 从上到下 的验证
    'DEFAULT_AUTHENTICATION_CLASSES': (
    # 配置JWT认证
    'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    # 配置session_id认证
    'rest_framework.authentication.SessionAuthentication',
    # 配置默认的认证方式 base:账号密码验证
    'rest_framework.authentication.BasicAuthentication',
   ),

#     # 自定义节流类
#     "DEFAULT_THROTTLE_CLASSES":["rest_app.app_throttles.UserThrottle"],# 配置默认的节流类,列表,路由配置多个
#     # 节流频率的规则,字典,key时第一步中节流类的scope属性,值是5/m
#     "DEFAULT_THROTTLE_RATES": {
#         "anonymous": '5/m',# 名称:次数/单位时间
#         "user": '10/m',
#    },

     #默认节流类
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
        
   ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '3/m', # 未经授权的角色anon
        'user': '5/m', # 已授权就是user
   },

views中记得注释标识匿名用户访问的代码
说明
rest_framework.throttling下,除了有SimpleRateThrottle这个简单的节流类外,还有三个内置的类:

  1. AnonRateThrottle:处理未经授权的用户,请求的IP地址用于生成用于限制的唯一键
  2. UserRateThrottle:处理授权的用户,用户标识用于生成要限制的唯一键。未经身份验证的请求将会退到使用传入请求的IP地址生成一个唯一的密钥来限制
  3. ScopedRateThrottle:当正在访问的视图包含throttle_scope属性时,才会应用此限制

4.指定视图节流

urls

REST_FRAMEWORK = {
    # 默认的验证是按照验证列表 从上到下 的验证
    'DEFAULT_AUTHENTICATION_CLASSES': (
    # 配置JWT认证
    'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    # 配置session_id认证
    'rest_framework.authentication.SessionAuthentication',
    # 配置默认的认证方式 base:账号密码验证
    'rest_framework.authentication.BasicAuthentication',
   ),

#     # 自定义节流类
#     "DEFAULT_THROTTLE_CLASSES":["rest_app.app_throttles.UserThrottle"],# 配置默认的节流类,列表,路由配置多个
#     # 节流频率的规则,字典,key时第一步中节流类的scope属性,值是5/m
#     "DEFAULT_THROTTLE_RATES": {
#         "anonymous": '5/m',# 名称:次数/单位时间
#         "user": '10/m',
#    },

#      #默认节流类
#     'DEFAULT_THROTTLE_CLASSES': [
#         'rest_framework.throttling.AnonRateThrottle',
#         'rest_framework.throttling.UserRateThrottle',
        
#    ],
#     'DEFAULT_THROTTLE_RATES': {
#         'anon': '3/m', # 未经授权的角色anon
#         'user': '5/m', # 已授权就是user
#    },
    
    #指定视图节流
    'DEFAULT_THROTTLE_CLASSES':[
        'rest_framework.throttling.ScopedRateThrottle',
        ],
    'DEFAULT_THROTTLE_RATES': {
        'students': '10/m',
        'uploads': '20/day',
   }
}

views

# 优化代码:
class StudentsView(generics.ListCreateAPIView):
    # 指定需要操作的数据与序列化类
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    # 添加身份验证功能
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    # 指定视图节流类
    throttle_scope = "students"
    
    # 重写新增方法,在保存Student时候关联用户
    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想成为数据分析师的开发工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值