Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

这次用到了redis模块和Redis数据库。那么代码如下:

首先,连接上redis数据库

1
2
port = 6379
r = redis.Redis(host='localhost', port=port)

然后是代码主体:

1
2
3
4
5
6
7
8
9
if not r.get(username):
r.setex(username, 500, 1)

else:
time_lock = int(r.get(username).decode('utf-8'))
if time_lock != 5:
r.setex(username, 500, time_lock + 1)
else:
return Response({'code': 200, 'message': '您的登录过于频繁,请稍后再试!'})

这里来说一下具体的逻辑:

首先是数据库的结构: 键(用户名), (失败次数), 计时。

如果登录的时候用户名或者密码出错,那么就向redis里插入一条以该用户名为名的可过期的键值对(因为我写的网站不允许有同名的用户名,所以将用户名设置为键也不怕锁错号),如果redis里面已经有以该用户名为键的键值对了,那么就把它读出来,将其值转换为整型,加一之后再存进数据库。如果读出来的时候值等于5了,那么就锁号。因为设置了过期时间,时间一到该键值对就会自动消失,也就是说时间一到该账号就又可以登录了。

不过这里还有个漏洞: 那就是登录成功5次依然会锁号···

所以我们需要在用户登录的时候将redis库中的键值对删掉:

1
r.delete('username')

这样就完成啦!总体来说,逻辑还是很清晰了,但是有的人使用的时候会有一些问题:

1
r.setex(key, time_in_second, value)

这条语句并不能成功将键值对插入数据库,我也不知道为什么,似乎是redis版本低的原因导致了不能设置过期时间,但是解决方法已经被那人找到了,现在将方法写出来:

1
r.expire(key, time_in_second)

使用这条语句搭配上set就可以实现了。另外补充一下: redis.setex设置的过期时间是以秒为单位的,所以设置的时候一定要将时间转换好。那么本次博客就到这里了!

评论



愿火焰指引你