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 18 Python
python Matplotlib画图之调整字体大小的示例
Nov 20 Python
详解TensorFlow在windows上安装与简单示例
Mar 05 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
DRF跨域后端解决之django-cors-headers的使用
Jan 27 Python
运用Python的webbrowser实现定时打开特定网页
Feb 21 Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 Python
python 画3维轨迹图并进行比较的实例
Dec 06 Python
python实现飞机大战游戏(pygame版)
Oct 26 Python
DjangoWeb使用Datatable进行后端分页的实现
May 18 Python
如何通过安装HomeBrew来安装Python3
Dec 23 Python
PyCharm常用配置和常用插件(小结)
Feb 06 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代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
PHP信号量基本用法实例详解
2016/02/12 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
PHP抽象类和接口用法实例详解
2019/07/20 PHP
发一个自己用JS写的实用看图工具实现代码
2008/07/26 Javascript
jQuery操作Select的Option上下移动及移除添加等等
2013/11/18 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
JavaScript中指定函数名称的相关方法
2015/06/04 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
javascript如何写热点图
2015/12/08 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
结合axios对项目中的api请求进行封装操作
2020/09/21 Javascript
python练习程序批量修改文件名
2014/01/16 Python
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
2018/06/21 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
Python 实现数组相减示例
2019/12/27 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
Python实现迪杰斯特拉算法过程解析
2020/09/18 Python
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
小学新教师培训方案
2014/02/03 职场文书
法制宣传日活动总结
2014/04/29 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
教代会闭幕词
2015/01/28 职场文书
学校实习推荐信
2015/03/27 职场文书
导游词之南京夫子庙
2019/12/09 职场文书
python使用pymysql模块操作MySQL
2021/06/16 Python