新闻项目——短信验证码

第一步:短信验证码

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

@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
原文地址:https://www.cnblogs.com/tyl23/p/13792769.html