django实现登录时候输入密码错误5次锁定用户十分钟
作者:北漂的雷子 发布时间:2023-04-17 14:48:57
在学习django的时候,想要实现登录失败后,进行用户锁定,切记录锁定时间,在网上找了很多资料,但是都感觉不是那么靠谱,于是乎,我开始了我的设计,其实我一开始想要借助redis呢,但是想要先开发一个简单的,后续在拆分后,然后在去进行拆分, 这样也是很接近我们在真实的开发中所遇到问题。
我的思路是:
输入账号密码》是否已经登录》提示已经登录
输入账号密码》错误次数少于6次》校验密码》登录成功,记录登录时间,错误次数清空,记录登录状态
输入账号密码》错误大于六次》提示锁定,并且记录错误次数
输入账号密码》是否冻结》提示冻结
这样我们就来设计我们的数据库:
class User(AbstractUser):
avatar=models.ImageField(upload_to='vaatar/%Y/%m',default='vaatar/default/pang')
qq=models.CharField(u'qq号码', max_length=20,blank=True)
mobile=models.CharField(u'手机号',max_length=11,blank=True,null=True,unique=True)
login_sta = models.CharField(u'登录是否锁定', max_length=2, default=0)
login_suo = models.DateTimeField(u'登录锁定时间')
pass_errnum=models.IntegerField(u'用户密码输入次数',default=0)
is_login = models.BooleanField(default=False)
class Meta:
verbose_name = u'用户'
verbose_name_plural = verbose_name
ordering=['-id']
def __str__(self) :
return self.username
这里的用户集成了django默认的用户来进行设计的,
那么我们同步我们的数据库。
同步后我们来看看我们的数据库,
整体结构出来了,我们来设计我们的登录用户的视图,这里还是采用面向对象的方式来设计我们的登录视图,
具体的实现如下:
from django.contrib.auth.hashers import make_password, check_password
from django.http import Http404, HttpResponseRedirect
from django.shortcuts import render, redirect
from django.views.generic.base import View
class LoginView(View):
def get(self,request):
return render(request, 'login.html')
def post(self,request):
next = request.META.get('HTTP_REFERER')
username=request.POST.get('username',None)
password=request.POST.get('password',None)
try:
user = User.objects.get(username= username)
if user.is_login==True:
return render(request, 'login.html', {'msg': '同时只能登陆一台设备!'})
if user.login_sta==True:
return render(request, 'login.html', {'msg': '账号已经冻结!'})
if (datetime.datetime.now()-user.login_suo).total_seconds() <600:
return render(request, 'login.html', {'msg': '账号锁定十分钟内不能登陆!'})
if user.pass_errnum>5:
user.login_suo=datetime.datetime.now()
return render(request, 'login.html', {'msg': '密码输入超过5次,用户锁定十分钟'})
if check_password(password,user.password) :
request.session['username'] = username
if '/logout' or '/reg' in next:
response = HttpResponseRedirect('/')
else:
response= HttpResponseRedirect(next)
user.last_login=datetime.datetime.now()
user.is_login=True
user.pass_errnum=0
user.save()
response.set_cookie('username', username, 3600)
return response
user.pass_errnum+=1
user.save()
return render(request, 'login.html', {'msg': '密码错误'})
except:
return render(request,'login.html',{'msg':'用户名不存在!'})
整体的思路以及实现,我们来实验下,这里的补充下,之前的我们的注册的密码,是按照原来的直接储存密码的,这样来说是不安全的,我们来使用django自带的进行密码加密解密。
我们来体验下我们的程序!
用户已经登录了,我们在另一台设备来退出我们的账号就可以
这样我们输入6次,就锁定了这个账号,同时也给我们记录了锁定时间。
其实这里我们推出的模块的设计如下:
class LogoutView(View):
def get(self,request):
try:
user = User.objects.get(username__exact=request.session['username'])
user.last_login=datetime.datetime.now()
user.is_login=False
user.save()
del request.session['username']
return render(request,'index.html')
except:
return HttpResponseRedirect('/')
退出我们就记录退出的,把登录状态给修改下。这样一个简单的限制用户登录时候输入密码次数的锁定就这么简单的实现了。
这样一个简单的django限制用户登录的时候密码输入次数就得到了解决。个人感觉十分方便。
这样做可能后期用户量大,会增加数据库的压力,后续可以吧这一块优化到我们的redis服务器中去。
来源:http://www.cnblogs.com/leiziv5/archive/2017/11/04/7783784.html


猜你喜欢
- 一、效果展示1、普通查询加序号SELECT t1.NAME,( @i := @i + 1 ) AS '序号' FROM t1
- 我就废话不多说了,大家还是直接看代码吧~<Form.Item label="作用对象"> &n
- 背景在 Golang 里面,我们经常使用 channel 进行协程之间的通信。这里有一个经典的场景,也就是生产者消费者模式,生产者协程不断地
- 本文主要介绍一下在学习可视化过程里遇到的一些情况比如cmap=plt.cm.Blues的映射import matplotlib.pyplot
- 本文实例讲述了django框架自定义模板标签(template tag)操作。分享给大家供大家参考,具体如下:django 提供了丰富的模板
- 笔者在运行 import tensorflow as tf时出现下面的错误,但在运行import tensorflow时没有出错。>&
- 前言Redis是一个开源的内存数据库,在项目开发中redis的使用也比较频繁,本文介绍了Go语言中go-redis库的基本使用。感兴趣的小伙
- 本文实例讲述了Python爬取国外天气预报网站的方法。分享给大家供大家参考。具体如下:crawl_weather.py如下:#encodin
- 我的Python环境:3.7在Python类里声明一个装饰器,并在这个类里调用这个装饰器。代码如下:class Test():
- 前言一个程序语言在运行的过程中,变量的声明在整个程序的生命周期中,是不断在进行的过程。任何程序的计算都会涉及至少一个变量,而计算的结果的则可
- 1 数据概览学生课程成绩:studentID、name、english、chinese、math,存在一定缺失值2 任务定义基于学生课程成绩
- python这样注释,让你的代码看起来更加的优雅,是不是常常感觉自己的python代码写出来,看起来特别的乱,虽然可以正常运行,但是在优雅性
- 目录一、定义二、作用三、导入1.import导入import 模块名from importfrom 模块名 import *总结一、定义包含
- 网页中使用flash可以增强页面的动态交互效果,特别是用flash来制作广告,效果更好。经常使用flash的人,可能就碰到了flash会遮住
- 应用场景1.需要将大型MP3文件切割成较小的部分以便上传或发送。2.需要从MP3文件中提取特定的音频片段,以便用于其他目的。3.需要快速制作
- 描述random() 方法返回随机生成的一个实数,它在[0,1)范围内。import randomhelp(random)FUNCTIONS
- nofollow标签是Google2005年推出的,目的是尽量减少垃圾链接对搜索引擎的影响。有用过网页制作工具的人都知道,在这些工具里是找不
- <script> Array.prototype.swap = function(i, j) { var temp = this
- Pillow图片格式转换Pillow 库支持多种图片格式,您可以直接使用 open() 方法来读取图片,并且无须考虑图片是何种类型。Pill
- 本文源于一时好奇,想要弄清出python的staticmethod()这一builtin方法的实现,查了一些资料(主要是python官方手册