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采集腾讯新闻实例
Jul 10 Python
python文件写入实例分析
Apr 08 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
Dec 27 Python
基于Python的文件类型和字符串详解
Dec 21 Python
对numpy Array [: ,] 的取值方法详解
Jul 02 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
python随机生成库faker库api实例详解
Nov 28 Python
Python中sorted()排序与字母大小写的问题
Jan 14 Python
Python如何实现在字符串里嵌入双引号或者单引号
Mar 02 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
Aug 27 Python
深入浅析pycharm中 Make available to all projects的含义
Sep 15 Python
python压包的概念及实例详解
Feb 17 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(2)――PHP类型
2010/02/15 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
2019/04/10 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
JavaScript 数组的 uniq 方法
2008/01/23 Javascript
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
2012/02/03 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
AngularJS中一般函数参数传递用法分析
2016/11/22 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
H5图片压缩与上传实例
2017/04/21 Javascript
微信小程序报错:this.setData is not a function的解决办法
2017/09/27 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
在Python中实现替换字符串中的子串的示例
2018/10/31 Python
django url到views参数传递的实例
2019/07/19 Python
python实现TCP文件传输
2020/03/20 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
python中threading和queue库实现多线程编程
2021/02/06 Python
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
Charles&Keith美国官方网站:新加坡快时尚鞋类和配饰零售商
2019/11/27 全球购物
群众路线教育实践活动方案
2014/02/02 职场文书
法定代表人授权委托书范文
2014/09/22 职场文书
小学生校园广播稿
2014/09/28 职场文书
2014年关工委工作总结
2014/11/17 职场文书
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang
实现GO语言对数组切片去重
2022/04/20 Golang
vue使用watch监听属性变化
2022/04/30 Vue.js