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中正则表达式的使用详解
Oct 17 Python
Python实现计算文件夹下.h和.cpp文件的总行数
Apr 23 Python
在Python的web框架中中编写日志列表的教程
Apr 30 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
对python文件读写的缓冲行为详解
Feb 13 Python
一文了解Python并发编程的工程实现方法
May 31 Python
解决Python安装时报缺少DLL问题【两种解决方法】
Jul 15 Python
基于Python检测动态物体颜色过程解析
Dec 04 Python
python str字符串转uuid实例
Mar 03 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 Python
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
Oct 16 Python
Python 的演示平台支持 WSGI 接口的应用
Apr 20 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
[EPIC] Larva vs Flash ZvT @ Crossing Field [2017-10-09]
2020/03/17 星际争霸
坏狼的PHP学习教程之第1天
2008/06/15 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
js关闭当前页面(窗口)的几种方式总结
2013/03/05 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
2020/12/24 Javascript
Angular实现form自动布局
2016/01/28 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
ES6 十大特性简介
2020/12/09 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
给Python初学者的一些编程技巧
2015/04/03 Python
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
Python之Scrapy爬虫框架安装及使用详解
2017/11/16 Python
Django权限机制实现代码详解
2018/02/05 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
在python 中实现运行多条shell命令
2019/01/07 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
解决python replace函数替换无效问题
2020/01/18 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
2020/03/06 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
PHP两种查询函数array/row的区别
2013/06/03 面试题
端口镜像是怎么实现的
2014/03/25 面试题
毕业生幼师求职自荐信
2013/10/01 职场文书
领导干部考察材料
2014/02/08 职场文书
初中班主任评语
2014/04/24 职场文书
2015年教研室工作总结范文
2015/05/23 职场文书
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL