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这个简单的节流类外,还有三个内置的类:
- AnonRateThrottle:处理未经授权的用户,请求的IP地址用于生成用于限制的唯一键
- UserRateThrottle:处理授权的用户,用户标识用于生成要限制的唯一键。未经身份验证的请求将会退到使用传入请求的IP地址生成一个唯一的密钥来限制
- 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)