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里disconnect UDP套接字的方法
Apr 23 Python
CentOS下使用yum安装python-pip失败的完美解决方法
Aug 16 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
Aug 30 Python
如何在python中使用selenium的示例
Dec 26 Python
python实现泊松图像融合
Jul 26 Python
python字典嵌套字典的情况下找到某个key的value详解
Jul 10 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
python图片剪裁代码(图片按四个点坐标剪裁)
Mar 10 Python
pytorch 限制GPU使用效率详解(计算效率)
Jun 27 Python
Keras实现DenseNet结构操作
Jul 06 Python
python 基于opencv去除图片阴影
Jan 26 Python
Python多线程 Queue 模块常见用法
Jul 04 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
生成缩略图
2006/10/09 PHP
php Smarty date_format [格式化时间日期]
2010/03/15 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
由Javascript实现的页面日历
2011/11/04 Javascript
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
Js 回车换行处理的办法及replace方法应用
2013/01/24 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
初识Node.js
2014/09/03 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
jQuery3.0中的buildFragment私有函数详解
2016/08/16 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
r.js来合并压缩css文件的示例
2018/04/26 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
简洁的十分钟Python入门教程
2015/04/03 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
python如何实时获取tcpdump输出
2020/09/16 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
报纸媒体创意广告词
2014/03/17 职场文书
项目建议书怎么写
2014/05/15 职场文书
小学教师自我剖析材料
2014/09/29 职场文书
建筑工地文明标语
2014/10/09 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
初中学生操行评语
2014/12/26 职场文书
小学优秀学生评语
2014/12/29 职场文书
运动会闭幕词
2015/01/28 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python