Flask项目详细短信验证码

代码逻辑

 

"""
注册,发送手机短信验证码
1.接收参数(mobile,image_code,image_code_id)
2.校验参数
判断参数是否齐全
校验手机号是否合法 用正则来校验
校验uuid是否能取出reids中存储的图片验证码的结果
校验图片验证码是否正确
3.生成短信验证码
4.讲短信验证码存储到redis
5.发短信
6.返回结果
:return:
"""

 

第一步

 1.获取参数

mobile = request.json.get("mobile")
image_code = request.json.get("image_code")
image_code_id = request.json.get("image_code_id")

 

 2.1校验获取到的参数

 

 

   不依托字典,自动构建字典,先导入jsonify这个包   errno:错误码     errmsg:错误信息

代码如下:

 if not all([mobile,image_code,image_code_id]):
       return jsonify(errno=RET.PARAMERR, errmsg="缺失参数")a

 

 2.2判断手机号是否合法

  当一个列表为空的时候结果就会为假,如果要处理非法数据的话想运行代码要用if not 取反

代码如下:    

mobile = mobile.stip()
    if not re.findall('^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号格式错误")

 2.3 校验uuid是否能取出reids中存的图片验证码

  先找到图片验证码的位置

 

 

   如果加了前缀"imageCode"  后面调用的时候也要带着前缀"imageCode"不然会取不到值,然后找uuid存到了哪一个变量

 

 

代码如下:

 try:
        image_code_server = sr.get("imageCode:" + image_code_id)
    except Exception as e:
        current_app.logger.error(e)  #写入日志
        return jsonify(errno=RET.DBERR, errmsg="数据库查询错误") #返回jsonify的相关内容
    # 如果验证码过期了或者别的原因找不到进行处理
    if not image_code_server:
        return jsonify(errno=RET.NODATA, errmsg="图片验证码过期")

 2.4 校验图片验证码是否正确

  只需要判断图片验证码 image_code_server和uuid image_code是否一致就可以了, lower会将所有的字母变成大写

 if image_code_server.lower() != image_code.lower():
        return jsonify(errno=RET.PARAMERR, errmsg="图片验证码错误")

 3.生成短信验证码

 用random随机模块进行创建随机数    用%补充随机数的位数 只能用0来补充

 smsCode = "%04d" %random.randint(0,9999)

 4.存储到redis

我们的手机验证码,短信验证码都用了前缀,所以这里也要加上前缀,不能用生成好的验证码作为键可以用它作为值,用mobile把手机号拼接到前面

然后ex设置验证码的有效时长

 try:
     sr.set("SMS:"+mobile, smsCode, ex=constants.IMAGE_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR, errmsg="短信验证码保存失败")

 5.发短信

首先要用到用户传过来的手机号mobile 参数为手机号, ['验证码', 几分钟后过期], 使用哪个模板      测试的短信模板编号为1

 ccp = CCP()
    #     # 注意: 测试的短信模板编号为1
    # 参数为手机号, ['验证码', 几分钟后过期], 使用哪个模板
    try:
       res = ccp.send_template_sms(mobile,[smsCode,constants.IMAGE_CODE_REDIS_EXPIRES / 60],1)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg="短信发送失败")
    # 如果res判断为-1就运行发送失败
    if res == -1:
        return jsonify(errno=RET.THIRDERR,errmsg="短信发送失败")

 6.返回结果

return jsonify(errno=RET.OK, errmsg="短信发送成功")

 

  redis在存储数据的时候是以二进制的方式进行存储的,但是我们要取的是字符串所以要在redis里面加入de_responses

 

 

 

 

 

posted @ 2021-10-13 20:30  沐公子  阅读(572)  评论(0)    收藏  举报