• 新闻项目——注册与登录


    第一步:注册后端逻辑补充

    我们上一次的注册代码写了一些还没写完,现在来把它补完。(注意有些代码需要导包)

    @passport_blue.route("/register",methods = ["post"])
    def register():
        """注册
        1.接受参数(手机号,短信验证码,密码明文)
        2.校验参数(判断是否缺少和手机号是否合法)
            2.1检查参数是否齐全
            2.2校验手机号是否合法
            2.3检查短信验证码是否正确
                读取redis中存储的短信验证码
                检查是否读取到该信息
                对比
        3.建立模型类对象
            密码加密问题
        4.提交到数据库中
        5.保存session,实现状态保持,注册即登录
        6.响应注册结果
        :return: 
        """
        #     1.接受参数(手机号,短信验证码,密码明文)
        res_dict = request.json   #相当于json.loads(request.data)
        mobile = res_dict.get("mobile")
        smscode = res_dict.get("smscode")
        password = res_dict.get("password")
        #     2.校验参数(判断是否缺少和手机号是否合法)
        #     2.1检查参数是否齐全
        if not all([mobile,smscode,password]):
            return jsonify(errno=RET.PARAMERR,errmsg="缺少参数")
        #     2.2校验手机号是否合法
        if not re.match("^1[3789][0-9]{9}$", mobile):  # 这里我们指定了第二位是3789其中的一位,如果判断手机号不合法
            return jsonify(errno=RET.PARAMERR, errmsg="手机号不合法")
        #     2.3检查短信验证码是否正确
        #     读取redis中存储的短信验证码
        try:
            sms_code_server = redis_store.get("sms_code:"+mobile)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR,errmsg="手机验证码读取失败")
        #     检查是否读取到该信息
        if not sms_code_server:
            return jsonify(errno=RET.NODATA,errmsg="未读取到手机验证码")
        #     对比
        if sms_code_server != smscode:
            return jsonify(errno=RET.PARAMERR,errmsg="手机验证码错误")
        # 3.建立模型类对象
        user = User()
        user.mobile = mobile
        user.nick_name = mobile
        user.last_login = datetime.datetime.now()
        # 密码加密问题
        user.password = password
        # 4.提交到数据库中
        try:
            db.session.add(user)
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            db.session.rollback()
            return jsonify(errno=RET.PARAMERR,errmsg="手机验证码错误")
        # 5.保存session, 实现状态保持,注册即登录
        session["mobile"] = user.mobile
        session["id"] = user.id
        session["nick_name"] = user.nick_name
        # 6.响应注册结果
        return jsonify(errno=RET.OK,errmsg="注册成功")

     这里有一个要注意的地方就是密码加密。

    关于密码加密通常有三种方式:

    1. 方案一:在这个视图中,直接调用对应的密码加密的算法,加密密码存储到数据库
    2. 方案二:在这个视图中,封装一个加密的方法,加密密码存储到数据库
    3. 方案三:在模型类中新增一个属性叫做password,并加载setter和getter方法,调用setter方法,直接完成密码的加密存储

    前两种方式会将加密方式暴露在视图中,所以这个项目中使用的密码加密方式是第三种,这种方法也是对python面向对象和程序设计时降低代码耦合度的较好体现。

     我们需要去到info的models里去写入加密代码,在用户下方隔两层再写

        @property
        def password(self):
            return "you can't read"
        
        @password.setter
        def password(self, value):
            self.password_hash = generate_password_hash(value)

    这里有一个快捷键props。

     第二步:注册前端逻辑补充

    我们后端代码写好后去运行代码,注册之后应该要有一个刷新页面,但现在并没有,那是因为我们前端还没处理好。

    现在我们就需要去写前端,去到info.templates的index.html里,在这里我们要按几次shift,然后输入main.js进入

     进到这里,我们要找到发起注册请求,找到你会发现这里是空的,所以我们要给它填上

    // 发起注册请求
            var params = {
                'mobile':mobile,
                'smscode':smscode,
                'password':password
            };
    
            $.ajax({
                url:'/passport/register', // 请求地址
                type:'post', // 请求方法
                data:JSON.stringify(params), // 请求参数
                contentType:'application/json',
                headers:{'X-CSRFToken':getCookie('csrf_token')}, // 在请求头中带上csrf_token
                success:function (response) {
                    if (response.errno == '0') {
                        // 注册成功
                        location.reload();
                    } else {
                        alert(response.errmsg);
                    }
                }
            });

    前端和后端都写好,就可以测试一下,如果测试成功你的数据库就会有这些

     第三步:登录后端逻辑

     注册写完,我们就该可以写登录了,还是老方法先写逻辑然后根据表写接口

    代码:

    @passport_blue.route("/login",methods = ["POST"])
    def login():
        """
        1.接收参数(手机号,密码)
        2.校验参数
            2.1校验参数是否齐全
            2.2校验手机号
                利用手机号从数据库中找到对应的用户信息
                如果没有代表没有该用户
            2.3校验密码
                注意加密位置
        3.写入session数据
        4.更新最后一次登录时间
        2.返回内容
        :return: 
        """
        # 1.接收参数(手机号,密码)
        res = request.json
        mobile = res.get("mobile")
        password = res.get("password")
        # 2.校验参数
        #     2.1校验参数是否齐全
        if not all([mobile,password]):
            return jsonify(errno=RET.PARAMERR,errmsg="缺少参数")
        #     2.2校验手机号
        if not re.match("^1[3789][0-9]{9}$", mobile):  # 这里我们指定了第二位是3789其中的一位,如果判断手机号不合法
                return jsonify(errno=RET.PARAMERR, errmsg="手机号不合法")
        #         利用手机号从数据库中找到对应的用户信息
        try:
            user = User.query.filter_by(mobile=mobile).first()
            # User.query.filter(User.mobile == mobile).first()
        except Exception as e:
            return jsonify(errno=RET.DBERR,errmsg="数据库查询失败")
        #         如果没有代表没有该用户
        if not user:
            return jsonify(errno=RET.NODATA,errmsg="没有找到该用户")
        #     2.3校验密码
        if not user.check_password(password):
            return jsonify(errno=RET.PWDERR, errmsg="用户名或者密码错误")
        # 3.写入session数据
        session["mobile"] = user.mobile
        session["id"] = user.id
        session["nick_name"] = user.nick_name
        # 4.更新最后一次登录时间
        user.last_login = datetime.datetime.now()
        try:
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            db.session.rolback()
            return jsonify(errno=RET.DATAERR,errmsg="数据库更新失败")
        # 2.返回内容
        return jsonify(errno=RET.OK, errmsg="登录成功")

    代码里我们有要注意的地方

    首先我们的密码是加密的而我要校验密码的话肯定是校验不了的,所以我们需要去改一下

    去到info的models里我们加密密码下加入代码

        def check_password(self, password):
            """
            用于校验密码
            :param password: 要检验的密码的明文
            :return: 返回校验的结果 True/False
            """
            return check_password_hash(self.password_hash, password)

    第四步:登录前端逻辑

    这里和注册的一样,我们去到main.js里加入登录代码

            // 发起登录请求
            var params = {
                'mobile':mobile,
                'password':password
            };
    
            $.ajax({
                url:'/passport/login',
                type:'post',
                data:JSON.stringify(params),
                contentType:'application/json',
                headers:{'X-CSRFToken':getCookie('csrf_token')}, // 在请求头中带上csrf_token
                success:function (response) {
                    if (response.errno == '0') {
                        // 登录成功后刷新当前界面
                        location.reload();
                    } else {
                        alert(response.errmsg);
                    }
                }
            });
  • 相关阅读:
    大数据组件
    k8s 证书过期时间调整
    k8s Metrics Server 获取资源指标与 hpa 部署
    k8s修改集群coredns
    k8s 版本升级
    k8s node节点剔除与增加
    etcd 单节点部署、备份与恢复
    k8s 连接ceph集群
    efk收集k8s 容器日志安装记录
    prometheus 监控k8s 安装测试记录
  • 原文地址:https://www.cnblogs.com/tyl23/p/13799648.html
Copyright © 2020-2023  润新知