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 相关文章推荐
教你如何在Django 1.6中正确使用 Signal
Jun 22 Python
python通过zlib实现压缩与解压字符串的方法
Nov 19 Python
Python二维码生成库qrcode安装和使用示例
Dec 16 Python
Python的Tornado框架异步编程入门实例
Apr 24 Python
Python查找函数f(x)=0根的解决方法
May 07 Python
Golang与python线程详解及简单实例
Apr 27 Python
python爬取微信公众号文章
Aug 31 Python
PyTorch 1.0 正式版已经发布了
Dec 13 Python
Python搭建Spark分布式集群环境
Jul 05 Python
PyTorch使用cpu加载模型运算方式
Jan 13 Python
Python过滤序列元素的方法
Jul 31 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
Dec 01 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 $_SERVER当前完整url的写法
2009/11/12 PHP
php生成略缩图代码
2012/07/16 PHP
php中引用符号(&amp;)的使用详解
2013/11/13 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
PHP微信开发之查询城市天气
2016/06/23 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
jquery 新浪网易的评论块制作
2010/07/01 Javascript
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
JavaScript设计模式之工厂方法模式介绍
2014/12/28 Javascript
js基础知识(公有方法、私有方法、特权方法)
2015/11/06 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
2016/06/01 Javascript
JS中数组重排序方法
2016/11/11 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
[46:16]2018DOTA2亚洲邀请赛3月30日 小组赛B组 iG VS VP
2018/03/31 DOTA
在Python的Django框架中加载模版的方法
2015/07/16 Python
Python模块包中__init__.py文件功能分析
2016/06/14 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
对python中GUI,Label和Button的实例详解
2019/06/27 Python
简单了解python中的与或非运算
2019/09/18 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
Pygame的程序开始示例代码
2020/05/07 Python
Python 操作 MySQL数据库
2020/09/18 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
最新自我评价范文
2013/11/16 职场文书
服装仓管员岗位职责
2014/06/17 职场文书
总经理司机岗位职责
2015/04/10 职场文书
婚宴祝酒词大全
2015/08/10 职场文书
2016天猫双十一广告语
2016/01/28 职场文书
学者《孟子》名人名言
2019/08/09 职场文书
javascript对象3个属性特征
2021/11/17 Javascript