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 相关文章推荐
Python中还原JavaScript的escape函数编码后字符串的方法
Aug 22 Python
对于Python中线程问题的简单讲解
Apr 03 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
Apr 20 Python
Python中分支语句与循环语句实例详解
Sep 13 Python
Python语言异常处理测试过程解析
Jan 08 Python
利用python实现凯撒密码加解密功能
Mar 31 Python
Python unittest discover批量执行代码实例
Sep 08 Python
Python基础之常用库常用方法整理
Apr 30 Python
Python-typing: 类型标注与支持 Any类型详解
May 10 Python
python办公自动化之excel的操作
May 23 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 Python
python自动化测试之Selenium详解
Mar 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 调试工具Debug Tools
2011/04/30 PHP
MySQL 日期时间函数常用总结
2012/06/12 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
十分钟打造AutoComplete自动完成效果代码
2009/12/26 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
JavaScript实现同步于本地时间的动态时间显示方法
2015/02/02 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
图片旋转、鼠标滚轮缩放、镜像、切换图片js代码
2020/12/13 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
jquery实现input框获取焦点的方法
2017/02/06 Javascript
深入理解vue中的$set
2017/06/01 Javascript
纯js实现图片匀速淡入淡出效果
2017/08/22 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
详细分析React 表单与事件
2020/07/08 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
python制作一个桌面便签软件
2015/08/09 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
Python排序函数的使用方法详解
2020/12/11 Python
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
应届生服务员求职信
2013/10/31 职场文书
大气污染防治方案
2014/05/19 职场文书
商场促销活动策划方案
2014/08/18 职场文书
初任公务员培训心得体会
2016/01/08 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
Go语言中break label与goto label的区别
2021/04/28 Golang
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
《地。-关于地球的运动-》单行本第七集上市,小说家朝井辽献上期待又害怕的推荐文
2022/03/31 日漫