这次用到了redis模块和Redis数据库。那么代码如下:
首先,连接上redis数据库
1 | port = 6379 |
然后是代码主体:
1 | if not r.get(username): |
这里来说一下具体的逻辑:
首先是数据库的结构: 键(用户名), (失败次数), 计时。
如果登录的时候用户名或者密码出错,那么就向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设置的过期时间是以秒为单位的,所以设置的时候一定要将时间转换好。那么本次博客就到这里了!