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实用日期时间处理方法汇总
May 09 Python
python脚本实现xls(xlsx)转成csv
Apr 10 Python
详解python里使用正则表达式的全匹配功能
Oct 19 Python
Python解决N阶台阶走法问题的方法分析
Dec 28 Python
Python实现读取字符串按列分配后按行输出示例
Apr 17 Python
Python wxpython模块响应鼠标拖动事件操作示例
Aug 23 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
Aug 05 Python
安装Pycharm2019以及配置anconda教程的方法步骤
Nov 11 Python
Django密码存储策略分析
Jan 09 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 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
PHP+DBM的同学录程序(4)
2006/10/09 PHP
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
JavaScript的public、private和privileged模式
2009/12/28 Javascript
jQuery AnythingSlider滑动效果插件
2010/02/07 Javascript
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
javascript操作符&quot;!~&quot;详解
2015/02/10 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
JS中利用FileReader实现上传图片前本地预览功能
2018/03/02 Javascript
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
微信小程序 自定义复选框实现代码实例
2019/09/04 Javascript
Python查找相似单词的方法
2015/03/05 Python
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
Python类的动态修改的实例方法
2017/03/24 Python
Python 多线程的实例详解
2017/09/07 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
触发器(trigger)的功能都有哪些?写出一个触发器的例子
2012/09/17 面试题
青年志愿者先进事迹
2014/05/06 职场文书
战略性融资合作协议书范本
2014/10/17 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
结婚仪式主持词
2015/06/29 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
redis lua限流算法实现示例
2022/07/15 Redis