django实现登录时候输入密码错误5次锁定用户十分钟


Posted in Python onNovember 05, 2017

在学习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默认的用户来进行设计的,

那么我们同步我们的数据库。

同步后我们来看看我们的数据库,

django实现登录时候输入密码错误5次锁定用户十分钟

整体结构出来了,我们来设计我们的登录用户的视图,这里还是采用面向对象的方式来设计我们的登录视图,  

具体的实现如下:

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自带的进行密码加密解密。

我们来体验下我们的程序!

django实现登录时候输入密码错误5次锁定用户十分钟

用户已经登录了,我们在另一台设备来退出我们的账号就可以

django实现登录时候输入密码错误5次锁定用户十分钟

这样我们输入6次,就锁定了这个账号,同时也给我们记录了锁定时间。

django实现登录时候输入密码错误5次锁定用户十分钟

 其实这里我们推出的模块的设计如下:

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服务器中去。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基础教程之自定义函数介绍
Aug 29 Python
Python列表计数及插入实例
Dec 17 Python
python3实现暴力穷举博客园密码
Jun 19 Python
python在每个字符后添加空格的实例
May 07 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
Pandas:DataFrame对象的基础操作方法
Jun 07 Python
Python常用特殊方法实例总结
Mar 22 Python
python多线程同步之文件读写控制
Feb 25 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
Sep 15 Python
通过实例简单了解Python中yield的作用
Dec 11 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
Mar 09 Python
详解Python openpyxl库的基本应用
Feb 26 Python
用Python登录好友QQ空间点赞的示例代码
Nov 04 #Python
Python通过命令开启http.server服务器的方法
Nov 04 #Python
Python实现一个简单的验证码程序
Nov 03 #Python
Python编程django实现同一个ip十分钟内只能注册一次
Nov 03 #Python
简单了解Python中的几种函数
Nov 03 #Python
python Pygame的具体使用讲解
Nov 03 #Python
Python算法输出1-9数组形成的结果为100的所有运算式
Nov 03 #Python
You might like
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
php文件读取方法实例分析
2015/06/20 PHP
jQuery each()小议
2010/03/18 Javascript
基于jQuery的360图片展示实现代码
2012/06/14 Javascript
JQuery select控件的相关操作实现代码
2012/09/14 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
分享10个原生JavaScript技巧
2015/04/20 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
AngularJS 表达式详细讲解及实例代码
2016/07/26 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
vue+element实现表单校验功能
2019/05/20 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
[01:59]游戏“zheng”当时试玩会
2019/08/21 DOTA
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
Django实现跨域的2种方法
2019/07/31 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
python实现音乐播放和下载小程序功能
2020/04/26 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
党员个人思想汇报
2013/12/28 职场文书
工地门卫岗位职责
2013/12/30 职场文书
校园绿化美化方案
2014/06/08 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
SQLServer中exists和except用法介绍
2021/12/04 SQL Server