新闻项目——短信验证码
第一步:短信验证码
首先我们根据上次写的逻辑来把代码补全。
@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="短信验证码发送成功")
这里的代码弄好之后,去到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.响应注册结果