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和shell实现的校验IP地址合法性脚本分享
Oct 23 Python
Python中DJANGO简单测试实例
May 11 Python
使用python实现rsa算法代码
Feb 17 Python
浅谈插入排序算法在Python程序中的实现及简单改进
May 04 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
Django 多语言教程的实现(i18n)
Jul 07 Python
Python开启线程,在函数中开线程的实例
Feb 22 Python
Python中三元表达式的几种写法介绍
Mar 04 Python
Python二维码生成识别实例详解
Jul 16 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
Jun 22 Python
Pycharm 如何设置HTML文件自动补全代码或标签
May 21 Python
Python TypeError: ‘float‘ object is not subscriptable错误解决
Dec 24 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通过正则表达式下载图片到本地的实现代码
2011/09/19 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
yii操作session实例简介
2014/07/31 PHP
PHP间隔一段时间执行代码的方法
2014/12/02 PHP
php二维码生成
2015/10/19 PHP
Yii2中多表关联查询hasOne hasMany的方法
2017/02/15 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
让广告代码不再影响你的网页加载速度
2006/07/07 Javascript
Javascript中的常见排序算法
2007/03/27 Javascript
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
HTML中事件触发列表与解说
2007/07/09 Javascript
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
Parcel 打包示例(React HelloWorld)
2018/01/16 Javascript
深入理解Angularjs 脏值检测
2018/10/12 Javascript
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
Python如何给函数库增加日志功能
2020/08/04 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
广告学专业毕业生自荐信
2014/05/28 职场文书
集中采购方案
2014/06/10 职场文书
会计学专业自荐信
2014/06/25 职场文书
计划生育证明书写要求
2014/09/17 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB
python3 字符串str和bytes相互转换
2022/03/23 Python
instantclient客户端 连接oracle数据库
2022/04/26 Oracle
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技