重写SimpleRateThrottle的get_cache_key
from rest_framework.throttling import SimpleRateThrottle
from django.core.cache import cache as default_cache
class MyThrottle(SimpleRateThrottle):
#存储的名字
scope = 'login'
THROTTLE_RATES = {'login': '5/m'}
#取settings内的redis
cache = default_cache
def get_cache_key(self, request, view):
if request.user:
ident = request.user.pk
else:
# 父类获取ip地址
ident = self.get_ident(request)
return self.cache_format % {
'scope': self.scope,
'ident': ident
}
视图
class LoginView(APIView):
throttle_classes = [MyThrottle]
def post(self, request):
username = request.data.get('username')
password = request.data.get('password')
user = models.UserInfo.objects.filter(username=username, password=password).first()
if not user:
return Response({'status': False, 'msg': '用户名密码错误', 'data': ''})
token = user.token = uuid.uuid4()
user.save()
return Response({'status': True, 'msg': '登录成功', 'data': token})
settings内
# redis
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "xxxx"
}
}
}
REST_FRAMEWORK = {
#限流频率控制
"DEFAULT_THROTTLE_RATES": {
'login': '5/m',
},
}
效果