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 相关文章推荐
Pyinstaller将py打包成exe的实例
Mar 31 Python
详解python 3.6 安装json 模块(simplejson)
Apr 02 Python
Python生成rsa密钥对操作示例
Apr 26 Python
python实现文件助手中查看微信撤回消息
Apr 29 Python
python selenium爬取斗鱼所有直播房间信息过程详解
Aug 09 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 Python
python numpy--数组的组合和分割实例
Feb 24 Python
Python loguru日志库之高效输出控制台日志和日志记录
Mar 07 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
Mar 10 Python
解决python执行较大excel文件openpyxl慢问题
May 15 Python
哪种Python框架适合你?简单介绍几种主流Python框架
Aug 04 Python
python 爬取华为应用市场评论
May 29 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之第八天
2006/10/09 PHP
用ODBC的分页显示
2006/10/09 PHP
php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
2014/12/24 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
PHP中散列密码的安全性分析
2019/07/26 PHP
PHP预定义接口――Iterator用法示例
2020/06/05 PHP
Js callBack 返回前一页的js方法
2008/11/30 Javascript
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
JS实现数组去重复值的方法示例
2017/02/18 Javascript
基于substring()和substr()的使用以及区别(实例讲解)
2017/12/28 Javascript
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
JS原型对象操作实例分析
2020/06/06 Javascript
[01:00:59]VP VS VG Supermajor小组赛胜者组第二轮 BO3第二场 6.2
2018/06/03 DOTA
基于Python实现的ID3决策树功能示例
2018/01/02 Python
Python远程视频监控程序的实例代码
2019/05/05 Python
Pytorch中accuracy和loss的计算知识点总结
2019/09/10 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
2020/01/15 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
英国女士和男士时尚服装网上购物:Top Labels Online
2018/03/25 全球购物
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
JAVA高级程序员面试题
2013/09/06 面试题
《世界多美呀》教学反思
2014/03/02 职场文书
兽医医药专业求职信
2014/07/27 职场文书
个人党性分析总结
2015/03/05 职场文书
校长新学期寄语2016
2015/12/04 职场文书
Python数据分析之pandas读取数据
2021/06/02 Python