zoukankan      html  css  js  c++  java
  • 新闻项目——短信验证码

    第一步:短信验证码

    首先我们根据上次写的逻辑来把代码补全。

    @passport_blue.route("/sms_code",methods=["POST"])
    def sms_code():
        """
        发送短信验证码
        1.接收参数(手机号,用户填写的图形验证码,uuid)
        2.校验参数
            2.1校验三个参数是否写全
            2.2校验手机号是否合法
            2.3校验图形验证码
                通过uuid从redis中拿到对应的文字验证码
                    考虑没有拿到的情况
                将用户传来的验证码和服务器中存储的验证码的验证码进行对比
        3.发送短信
            3.1随机一个短信验证码
            3.2发送验证码
        4.将生成的手机验证码存储到redis中方便下一次的校验
        4.返回(消息)
        :return: 
        """
        # 发送短信验证码
        res = request.date
        res_dict = json.loads(res)
        mobile = res_dict.get("moblie")
        image_code = res_dict.get("image_code")
        image_code_id = res_dict.get("image_code_id")
        #     1.接收参数(手机号,用户填写的图形验证码,uuid)
        #     2.校验参数
        #         2.1校验三个参数是否写全
        if not all([mobile, image_code, image_code_id]):
            return jsonify(errno=RET.PARAMERR, errmsg="参数不全")
        #         2.2校验手机号是否合法
        if not re.match("^1[3789][0-9]{9}$",mobile):
            return jsonify(errno=RET.PARAMERR, errmsg="手机号不合法")
        #         2.3校验图形验证码
        #             通过uuid从redis中拿到对应的文字验证码
        try:
            image_code_serever = redis_store.get("image_code"+image_code_id)
        except Exception as e:
            return jsonify(errno=RET.DBERR, errmsg="图像验证码获取失败")
        #                 考虑没有拿到的情况
        if not image_code_serever:
            return jsonify(errno=RET.DBERR, errmsg="没有找到图像验证码")
        #             将用户传来的验证码和服务器中存储的验证码的验证码进行对比
        if not image_code_serever.lower() != image_code_serever.lower():
            return jsonify(errno=RET.PARAMERR, errmsg="图像验证码错误")
        #     3.发送短信
        #         3.1随机一个短信验证码
        sms_code = "%04d" % random.randint(0,999)
        #         3.2发送验证码
        res_sms = CCP().send_template_sms(mobile,[sms_code,5],1)
        if not res_sms == 0:
            return  jsonify(errno=RET.THIRDERR,errmsg="短信发送失败")
        #     4.将生成的手机验证码存储到redis中方便下一次的校验
        try:
            redis_store.set("sms_code:"+mobile, sms_code)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DATAERR, errmsg="短信验证码写入失败")
        #     4.返回(消息)
        return jsonify(errno=RET.OK, errmsg="短信验证码发送成功")
    View Code

     这里的代码弄好之后,去到templates中的news目录下的index.html进入下面红框里的源代码去写短信验证码

     进入之后在发送短信验证码那写入代码:

        var params = {
            'mobile':mobile,
            'image_code':imageCode,
            'image_code_id':imageCodeId
        };
    
        // TODO 发送短信验证码
        $.ajax({
            url:'/passport/sms_code',   // 请求地址
            type:'post',                // 请求方法
            data:JSON.stringify(params),// 请求参数
            contentType:'application/json',// 数据类型
            success:function (response) {  // 回调函数
                if (response.errno == '0') {
                    // 发送短信验证码成功
                    alert(response.errmsg);
                } else {
                    alert(response.errmsg);
                }
            }
        });

     接着我们来测试一下项目,会发现没有提示,控制台也报了一个错误这个错误是我们的csrf错误

     

     这里是我们csrf没有什么操作所以报的错,所以我去把它注释掉。注释掉后我们去给代码打上断点,重新运行一下代码。运行的时候要注意改端口

    用断点来运行是为发现哪里会报错,会有一个二进制错误

     这里去到init info里改一下redis的代码。

    redis_store = StrictRedis(host=configs[env].REDIS_HOST, port=configs[env].REDIS_PORT,decode_responses=True)

    接着运行会发现短信有些问题,所以我们需要改一下:

     第二步:补充逻辑,有效时间

    在info文件夹下面有一个constants文件,里面放着图片验证码的有效时间的信息

    接着我们passport的views里导入这个constants包

    接着在修改有效时间

     还有下面的也要改

     第五步:注册1

     注册也有一个相关的接口设计,我要根据这个来写。

    首先还是先把逻辑写出来。

    @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.建立模型类对象
        # 密码加密问题
        # 4.提交到数据库中
        # 5.保存session, 实现状态保持,注册即登录
        # 6.响应注册结果
    View Code
  • 相关阅读:
    vim 命令详解
    Helloworld with c
    VS扩展开发框架
    Putty是一个专业的SSH连接客户端
    你的Java代码对JIT编译友好么?(转)
    java nio的一个严重BUG(转)
    JVM可支持的最大线程数(转)
    Java下获取可用CPU数
    java观察者模式(转)
    Android开发之控制Toast的开启与关闭
  • 原文地址:https://www.cnblogs.com/tyl23/p/13792769.html
Copyright © 2011-2022 走看看