短信验证码
前期准备
首先进入templates目录下的news目录中的index页面
如下图配置:
// 发送短信验证码
function sendSMSCode() {
// 校验参数,保证输入框有数据填写
$(".get_code").removeAttr("onclick");
var mobile = $("#register_mobile").val();
if (!mobile) {
$("#register-mobile-err").html("请填写正确的手机号!");
$("#register-mobile-err").show();
$(".get_code").attr("onclick", "sendSMSCode();");
return;
}
var imageCode = $("#imagecode").val();
if (!imageCode) {
$("#image-code-err").html("请填写验证码!");
$("#image-code-err").show();
$(".get_code").attr("onclick", "sendSMSCode();");
return;
}
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);
}
}
});
}
将response_code文件copy到info目录下,然后在info目录下,建一个libs目录,将yuntongxun目录copy到libs目录下,进入sms文件,进行配置:
代码实现
记得先把info目录的init文件中的CRSF保护给关掉
首先进入passport目录,进入views文件配置:
import re
import random
from . import passport_blue
from flask import request, abort, current_app, make_response, jsonify
from info.utils.captcha.captcha import captcha
from info import sr
from info.response_code import RET
from info.libs.yuntongxun.sms import CCP
from info import constants
@passport_blue.route('/image_code')
def image_code():
"""
生成图片验证码
1.接收参数(uuid)
2.校验参数
2.1校验是否携带参数
3.生成图片验证
4.将图片验证码的文本保存到Redis中
5.返回图片对象
:return: 图片响应对象
"""
# 生成图片验证码
# 1.接收参数(uuid)
imageCodeId = request.args.get('imageCodeId')
# 2.校验参数
# 2.1校验是否携带参数
if not imageCodeId:
abort(403)
# 3.生成图片验证
name, imageCodeIdText, imageCode = captcha.generate_captcha()
print(imageCodeIdText)
# 4.将图片验证码的文本保存到Redis中
try:
sr.set("imageCode:" + imageCodeId, imageCodeIdText,ex=constants.IMAGE_CODE_REDIS_EXPIRES)
except Exception as e:
current_app.logger.error(e)
abort(500)
# 5.返回图片对象
response = make_response(imageCode)
response.headers['Content-Type'] = 'image/jpg'
return response
@passport_blue.route('/sms_code', methods=['POST'])
def sms_code():
"""
发送手机短信
1. 接收参数
2. 校验参数
2.1 校验参数是否齐全
2.2 手机号是否合法 >>> 正则
2.3 根据uuid从Redis中获取图形验证码的文本
2.4 判断图形验证码的文本是否存在
2.5 判断用户发送的和数据库存的是否匹配
3. 发送短信验证码
4. 返回结果
:return:
"""
# 1. 接收参数
mobile = request.json.get("mobile")
image_code = request.json.get("image_code")
image_code_id = request.json.get("image_code_id")
# 2. 校验参数
# 2.1 校验参数是否齐全
if not all([mobile, image_code, image_code_id]):
return jsonify(errno=RET.PARAMERR, errmsg='缺失参数')
# 2.2 手机号是否合法 >>> 正则
mobile = mobile.strip()
if not re.findall('^1[3456789]\d{9}$', mobile):
return jsonify(errno=RET.PARAMERR, errmsg='缺失参数')
# 2.3 根据uuid从Redis中获取图形验证码的文本
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='图形验证码获取失败')
# 2.4 判断图形验证码的文本是否存在
if not image_code_server:
return jsonify(errno=RET.NODATA, errmsg='图形验证码获取失败')
# 2.5 判断用户发送的和数据库存的是否匹配 》大小写统一
if not image_code_server.lower() == image_code.lower():
return jsonify(errno=RET.DATAERR, errmsg='图形验证码错误')
# 3. 发送短信验证码
sms_number = '%04d' % random.randint(0, 9999)
try:
res = CCP().send_template_sms(mobile, [sms_number, constants.SMS_CODE_REDIS_EXPIRES//60], 1)
except Exception as e:
current_app.logger.error(e)
return jsonify(errno=RET.THIRDERR, errmsg='短信发送失败')
if res != 0 :
return jsonify(errno=RET.THIRDERR, errmsg='短信发送失败')
# 4. 判断
try:
sr.set('SMS:'+mobile, sms_number, ex=constants.SMS_CODE_REDIS_EXPIRES)
except Exception as e:
current_app.logger.error(e)
return jsonify(errno=RET.DBERR, errmsg='短信验证码保存失败')
# 5. 返回结果
return jsonify(errno=RET.OK, errmsg='成功')
记住在sms_code方法,接收参数处 mobile = request.json.get(“mobile”),打个断点,然后调试运行,就OK了