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通过装饰器检查函数参数数据类型的方法
Mar 13 Python
Python常见格式化字符串方法小结【百分号与format方法】
Sep 18 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
Feb 16 Python
Python元组及文件核心对象类型详解
Feb 11 Python
python 接口测试response返回数据对比的方法
Feb 11 Python
python实现音乐下载器
Apr 15 Python
tensorflow实现简单的卷积网络
May 24 Python
Python全局变量与局部变量区别及用法分析
Sep 03 Python
对python调用RPC接口的实例详解
Jan 03 Python
基于Python计算圆周率pi代码实例
Mar 25 Python
python json.dumps中文乱码问题解决
Apr 01 Python
从np.random.normal()到正态分布的拟合操作
Jun 02 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 验证码实例代码
2010/06/01 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
php自动获取关键字的方法
2015/01/06 PHP
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
php依赖注入知识点详解
2019/09/23 PHP
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
JavaScript reduce和reduceRight详解
2016/10/24 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
2018/12/11 jQuery
vue-router路由模式详解(小结)
2019/08/26 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
跟老齐学Python之永远强大的函数
2014/09/14 Python
Python线程中对join方法的运用的教程
2015/04/09 Python
Python素数检测的方法
2015/05/11 Python
详解Django 时间与时区设置问题
2019/07/23 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
Python中常见的数制转换有哪些
2020/05/27 Python
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
计算机专业应届毕业生自荐信
2013/09/26 职场文书
新闻学毕业生自荐信
2013/11/15 职场文书
超市总经理岗位职责
2014/02/02 职场文书
会计自我鉴定
2014/02/04 职场文书
无犯罪记录证明
2014/09/19 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis