1. 五分钟密码错误3次封禁账号30分钟

思路: 将输入错误的用id用redis存起来,设置过期30分钟的过期时间,还有错误次数
当次数大于等于三次的时候,查询用户id,查询得到就要封禁30分钟,查询不到就登陆

1. 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class UserView(APIView):

def post(self, request):
username = request.data.get('username')
password = request.data.get('password')

user_li = User.objects.filter(username=username, password=password).first()
r = MyRedis()
user_black = username + 'black'
if r.get(user_black):
# 判断黑名单是否存在
return Response({'code': 404, 'msg': '账号已经被冻结30分钟'})
else:
if not user_li:
# 密码错误
if r.get(username):
# 判断错误次数
sum = r.get(username)
# print(sum)
if int(sum) >= 4:
r.set(user_black, 1)
r.exp(username, 3000)
else:
r.inc(username)
return Response({'code': 400, 'msg': '账号或密码错误'})
else:
r.set(username, 1)
r.exp(username, 300)
return Response({'code': 400, 'msg': '账号或密码错误'})
else:
return Response({'code': 200, 'msg': '登陆成功'})

Reids类代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyRedis:

def __init__(self, **redis_kwargs):
self.__db = redis.Redis(**redis_kwargs)

def set(self, key, value):
self.__db.set(key, value)

def get(self, key):
return self.__db.get(key)

def inc(self, key): # Redis内置方法用来做累加
self.__db.incrby(key, 1)

def exp(self, key, time): # 设置过期时间
self.__db.expire(key, time)