django中账号密码验证登陆功能的实现方法


Posted in Python onJuly 15, 2019

今天分享一下django的账号密码登陆,前端发送ajax请求,将用户名和密码信息发送到后端处理,后端将前端发送过来的数据跟数据库进行过滤匹配,成功就跳转指定页面,否则就把相对应的错误信息返回,同时增加一个小功能,在规定时间内超过规定的登录次数,就锁住无法登陆,等下一个时间段再允许登陆。

一、通过ORM创建一张历史登陆表

class login_history(models.Model):
  user = models.CharField(max_length=32, verbose_name='登录用户')
  ip = models.GenericIPAddressField(verbose_name='用户IP地址')
  count = models.SmallIntegerField(verbose_name='登录次数')
  lock = models.SmallIntegerField(verbose_name='锁')
  utime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
  class Meta:
    db_table = "login_history"
    verbose_name = "历史登录"
    verbose_name_plural = "历史登录"
  def __str__(self):
    return self.user

二、前端图片跟代码展示

django中账号密码验证登陆功能的实现方法

前端代码

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title> - 登录</title>
  <meta name="keywords" content="">
  <meta name="description" content="">
  <link rel="shortcut icon" href="/static/favicon.ico">
  {% include 'css_comm.html' %}
</head>
<body class="gray-bg">
  <div class="middle-box text-center loginscreen animated fadeInDown" >
    <div style="margin-top: 40px">
      <h3>欢迎使用 AutoOps</h3>
        {% csrf_token %}
        <div class="form-group" >
          <input type="text" name="user" value="" class="form-control user_obj" placeholder="用户名" required="" autocomplete="off">
        </div>
        <span style="display: block;margin-bottom: 10px;color:red" id="user_error"></span>
        <div class="form-group">
          <input type="password" name="pwd" value="" class="form-control pwd_obj" placeholder="密码" required="" autocomplete="off">
        </div>
        <span style="display: block;margin-bottom: 10px;color:red" id="pwd_error"></span>
        <button type="submit" class="btn btn-info block full-width m-b btn_obj">登 录</button>
        记住密码 <input type="checkbox" style="margin: 0">
    </div>
  </div>
  {% include 'js_comm.html' %}
  <script>
    $(".btn_obj").click(function () {
      var user = $(".user_obj").val();
      var pwd = $(".pwd_obj").val();
      $.ajaxSetup({headers: {"X-CSRFToken": '{{ csrf_token }}'}});
      $.ajax({
        "url": "/login.html",
        "type": "post",
        "data": {"user":user,"pwd":pwd},
        success: function (data) {
          var obj = JSON.parse(data);
          if (obj.status) {
            $(".user_obj").css("border-color","");
            $("#user_error").text("");
            $(".pwd_obj").css("border-color","");
            $("#pwd_error").text("");
             window.location.href = '/assets/assets_list.html';
          }
          else {
            if (obj.error.user_error != "") {
              $(".user_obj").css("border-color","red");
              $("#user_error").text(obj.error.user_error);
            }else {
              $(".user_obj").css("border-color","");
              $("#user_error").text("");
            }
            if (obj.error.pwd_error != "") {
              $(".pwd_obj").css("border-color","red");
              $("#pwd_error").text(obj.error.pwd_error);
            }else {
              $(".pwd_obj").css("border-color","");
              $("#pwd_error").text("");
            }
            if (obj.error.login_error != "") {
              alert("登录失败",obj.error.login_error, "", {type: 'error'})
            }
          }
        }
      })
    })
  </script>
</body>
</html>

后端代码

def login(request):
  ret = {"status": False, "error": {"user_error": "", "pwd_error": "", "login_error": ""}}
  if request.method == "POST":
    user = request.POST.get("user") #获取用户名
    pwd = request.POST.get("pwd") #获取密码
    if request.META['REMOTE_ADDR']: #判断是否获取用户IP地址
      access_ip = request.META['REMOTE_ADDR']  #存到access_ip变量中
    else:
      access_ip = request.META['HTTP_X_FORWARDED_FOR']  #获取用户的真实IP,非代理IP
    if access_ip:
      ip_obj = models.login_history.objects.filter(ip=access_ip).first()  #在历史登录表中查找是否有这个IP
      if ip_obj:
        current_time = datetime.datetime.now()     #获取当前时间
        second = current_time - ip_obj.utime       #用当前时间减去最近登录的时间
        second = second.seconds  #转换为秒数
        count = ip_obj.count   #获取当前对象的登录次数
        count = count + 1     #次数加1
        ip_obj.count = count   #修改次数信息
        ip_obj.save()         #保存
        if second < 60 and count >= 10:   #判断秒数是否小于60秒并且次数大于等于10
          ret["error"]["login_error"] = "过于频繁登录,你已经被锁着,等一会60秒之后再登录"
          ip_obj.user = user   #登录的用户名
          ip_obj.lock = 1      #值为1表示锁着
          ip_obj.save()       #保存
          return HttpResponse(json.dumps(ret))  #返回给前端
        elif ip_obj.lock == 1 and second >= 60:    #判断lock是否等于1和秒数大于60秒
          ip_obj.lock = 0     #值为0表示解锁
          ip_obj.count = 1    #初始化登录次数
          ip_obj.save()      #保存
      else:
        models.login_history.objects.create(user=user, ip=access_ip, count=1, lock=0) #没有登录过,就创建记录
    if user:
      account_obj = Account.objects.filter(username=user).first()  #判断这个用户名是否存在
      if not account_obj:
        ret["error"]["user_error"] = "用户名错误或者不存在"
    else:
      ret["error"]["user_error"] = "用户名不能为空"
    if pwd == "":
      ret["error"]["pwd_error"] = "密码不能为空"
    users = authenticate(username=user, password=pwd)   #验证用户名和密码是否一样
    if users:
      request.session["user_id"] = users.pk    #存储到session会话中
      initial_session(users, request)
      ret["status"] = True
      ip_obj.count = 1      # 登录次数等于1
      ip_obj.save()
      return HttpResponse(json.dumps(ret))  #返回前端
    else:
      ret["error"]["pwd_error"] = "用户名或密码不正确"
    return HttpResponse(json.dumps(ret))
  return render(request, "login.html")

三、测试效果

1.不输入账号密码登录,会提示错误信息

django中账号密码验证登陆功能的实现方法

2.输入不存在的用户

django中账号密码验证登陆功能的实现方法

3.输入错误密码

django中账号密码验证登陆功能的实现方法

4.在60秒内连续输错10次密码,可以让恶意登录的,锁着无法再让其登录

django中账号密码验证登陆功能的实现方法

5.查看数据库表信息

django中账号密码验证登陆功能的实现方法

6.最后演示登录成功跳转图

django中账号密码验证登陆功能的实现方法

总结

以上所述是小编给大家介绍的django中账号密码验证登陆功能的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
15行Python代码带你轻松理解令牌桶算法
Mar 21 Python
解决Python3中的中文字符编码的问题
Jul 18 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 Python
python自动化测试无法启动谷歌浏览器问题
Oct 10 Python
基于Python实现拆分和合并GIF动态图
Oct 22 Python
django框架基于queryset和双下划线的跨表查询操作详解
Dec 11 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
Python图片处理模块PIL操作方法(pillow)
Apr 07 Python
keras中的loss、optimizer、metrics用法
Jun 15 Python
如何用Matplotlib 画三维图的示例代码
Jul 28 Python
Python logging模块原理解析及应用
Aug 13 Python
python tkinter窗口最大化的实现
Jul 15 #Python
在pycharm下设置自己的个性模版方法
Jul 15 #Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 #Python
在python中将list分段并保存为array类型的方法
Jul 15 #Python
详解Python对JSON中的特殊类型进行Encoder
Jul 15 #Python
linux中如何使用python3获取ip地址
Jul 15 #Python
python实现中文文本分句的例子
Jul 15 #Python
You might like
php ftp文件上传函数(基础版)
2010/06/03 PHP
浅析php header 跳转
2013/06/17 PHP
解析获取优酷视频真实下载地址的PHP源代码
2013/06/26 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
2017/01/13 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
jquery ajax post提交数据乱码
2013/11/05 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
Javascript自执行匿名函数(function() { })()的原理浅析
2016/05/15 Javascript
微信小程序 使用canvas制作K线实例详解
2017/01/12 Javascript
js获取指定时间的前几秒
2017/04/05 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
Python检测QQ在线状态的方法
2015/05/09 Python
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
python实现将读入的多维list转为一维list的方法
2018/06/28 Python
django框架用户权限中的session缓存到redis中的方法
2019/08/06 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
python SocketServer源码深入解读
2019/09/17 Python
python实发邮件实例详解
2019/11/11 Python
小结Python的反射机制
2020/09/28 Python
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
美国折扣地毯销售网站:Rugs.com
2020/03/27 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
文化产业实施方案
2014/06/07 职场文书
租房协议书范例
2014/10/14 职场文书
小学生读书笔记范文
2015/06/30 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python