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 optparse模块使用实例
Apr 09 Python
在Python的Flask框架中实现全文搜索功能
Apr 20 Python
Python实现方便使用的级联进度信息实例
May 05 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
Jun 29 Python
Django 根据数据模型models创建数据表的实例
May 27 Python
pandas 数据实现行间计算的方法
Jun 08 Python
Python json模块dumps、loads操作示例
Sep 06 Python
python实现将汉字保存成文本的方法
Nov 16 Python
使用pyshp包进行shapefile文件修改的例子
Dec 06 Python
python实现高斯投影正反算方式
Jan 17 Python
pytorch 计算ConvTranspose1d输出特征大小方式
Jun 23 Python
通过代码简单了解django model序列化作用
Nov 12 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
解析php中如何调用用户自定义函数
2013/08/06 PHP
set_exception_handler函数在ThinkPHP中的用法
2014/10/31 PHP
微信公众平台消息接口校验与消息接口响应实例
2014/12/23 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
nodejs中使用HTTP分块响应和定时器示例代码
2017/03/19 NodeJs
js处理包含中文的字符串实例
2017/10/11 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
vue在响应头response中获取自定义headers操作
2020/07/24 Javascript
python中实现延时回调普通函数示例代码
2017/09/08 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
python将视频转换为全字符视频
2019/04/26 Python
在CentOS7下安装Python3教程解析
2020/07/09 Python
python缩进长度是否统一
2020/08/02 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
详解如何使用rem或viewport进行移动端适配
2020/08/14 HTML / CSS
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
办理居住证介绍信
2014/01/15 职场文书
2014年部门工作总结
2014/11/12 职场文书
2014年医生工作总结
2014/11/21 职场文书
2015年依法行政工作总结
2015/04/29 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
基于Python的EasyGUI学习实践
2021/05/07 Python
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python