Django短信验证码

Django短信验证码

在阿里云中购买短信服务https://www.aliyun.com/

将短信验证码保存到redis中, 存取速度快,减轻mysql数据库服务器压力。

redis中的键可以设置过期时间, 短信验证码可以设置2分钟过期时间,过期自动销毁。

获取redis连接

# 导入redis连接方法
from django_redis import get_redis_connection
# 使用默认配置连接到redis
cnn = get_redis_connection('default')
# 使用连接上的方法操作redis
cnn.hset('对象名''属性''值')

使用redis的命令

查看手册http://doc.redisfans.com/

封装两个方法:

发送手机短信的方法

# 发送手机验证码
def send_phone_code(request):
    """
    :param request:  HttpRequest 请求对象
    :param phone:  手机号码
    :return: 返回结果
    """
    try:
        # 获取手机号码
        phone = request.GET.get('phone')
        # 验证手机号是否正确
        phone_re = re.compile('^1[3-9]\d{9}$')
        res = re.search(phone_re, phone)
        if res:
            # 生成随机验证码
            code = "".join([str(random.randint(0, 9)) for _ in range(4)])
            print(code)
            print("===========================")
            # 保存到redis中 ,等你验证的时候使用
            r = get_redis_connection('default')
            r.set(tel, code)
            # 设置过期时间 redis
            r.expire(tel, 120)
            # 发送短信验证码
            __business_id = uuid.uuid1()
            # 信息
            params = "{\"code\":\"%s\"}" % code
            rs = send_sms(__business_id, phone, "模板名称", "SMS_141905190", params)
            print(rs.decode('utf-8'))
            return {'ok': 1, 'code': 200}
        else:
            return {'ok': 0, 'code': 500, 'msg': '手机号码格式错误!'}
    except:
        return {'ok':0,'code':500,'msg':'短信验证码发送失败'}

发送的方法

# 发送短信
def send_sms(business_id, phone_numbers, sign_name, template_code, template_param=None):
    # 注意:不要更改
    REGION = "cn-hangzhou"
    PRODUCT_NAME = "Dysmsapi"
    DOMAIN = "dysmsapi.aliyuncs.com"
    # acs_client = AcsClient(const.ACCESS_KEY_ID, const.ACCESS_KEY_SECRET, REGION)
    acs_client = AcsClient(settings.ACCESSKEYID, settings.ACCESSKEYSECRET, REGION)
    region_provider.add_endpoint(PRODUCT_NAME, REGION, DOMAIN)
    smsRequest = SendSmsRequest.SendSmsRequest()
    # 申请的短信模板编码,必填
    smsRequest.set_TemplateCode(template_code)
    # 短信模板变量参数
    if template_param is not None:
        smsRequest.set_TemplateParam(template_param)
    # 设置业务请求流水号,必填。
    smsRequest.set_OutId(business_id)
    # 短信签名
    smsRequest.set_SignName(sign_name)
    # 数据提交方式
    # smsRequest.set_method(MT.POST)
    # 数据提交格式
    # smsRequest.set_accept_format(FT.JSON)
    # 短信发送的号码列表,必填。
    smsRequest.set_PhoneNumbers(phone_numbers)
    # 调用短信发送接口,返回json
    smsResponse = acs_client.do_action_with_exception(smsRequest)
    # TODO 业务处理
    return smsResponse  return smsResponse

创建视图函数并绑定路由

# 短信发送 视图函数
def sendMsg(request):
    return JsonResponse(send_phone_code(request))
# 8. 路由绑定
urlpatterns = [
    url(r'^sendMsg/$', sendMsg, name='sendMsg'), # 发短信
]

ajax 点击按钮 js 代码

{% block footer_js %}
    <script>
        $(function () {
            // 验证码按钮上绑定点击事件
            $(".yzm-hq").on('click', function () {
                // 由于this会在很多匿名函数中使用,先将其保存在一个变量中
                // 因为其他匿名函数中有自己的this,会和点击事件的this冲突
                var that = this;
                // 获取手机号码
                phone = $("input[name='phone']").val();
                // 通过ajax发送get请求
                $.get('{% url "sp_user:sendMsg" %}', {'phone': phone}, function (data) {
                    //判断是否请求成功
                    if (data.ok == 1) {
                        // 设定 60 秒后可以重新发送验证码
                        var time = 60;
                        // 立马 将按钮禁用 防止重复点击提交
                        $(that).attr('disabled', true);
                        // 颜色设置为 灰色
                        $(that).css({'backgroundColor': "gray"});
                        // 将按钮提示文字改变
                        showMsg(that, time);
                        // 设置周期性执行, 周期性改变显示文字内容
                        var timer = window.setInterval(function () {
                            // 时间减少
                            --time;
                            // 显示文字
                            showMsg(that, time);
                            // 判断是否到期
                            if (time == 0) {
                                // 到期后清除定时器
                                window.clearInterval(timer);
                                // 启用按钮
                                $(that).attr('disabled', false);
                                // 改变颜色和文字内容
                                $(that).css({'backgroundColor': "#76bb2a"});
                                $(that).val("获取验证码");
                            }
                        }, 1000)
                    } else {
                        alert(data.msg);
                    }
                })
            });
            //改变按钮 倒计时显示内容
            function showMsg(obj, time) {
                var msg = time + "秒后重新发送!";
                $(obj).val(msg);
            }
        })
    </script>
{% endblock %}

在RegisterView注册视图中验证提交的验证码核心代码

form表单中的核心验证验证码的代码

# 验证码字段添加
verify_code = forms.CharField(error_messages={"required": "请填写验证"})
# 单独使用一个方法校验 验证码
def clean_verify_code(self):
    # 验证验证码是否填写正确
    # 获取redis中的验证码
    r = get_redis_connection()
    tel = self.cleaned_data.get('phone')
    s_verify_code = r.get(tel)
    if not s_verify_code:
        raise forms.ValidationError("验证码已经过期")
    # 表单传入的验证码
    verify_code = self.cleaned_data.get('verify_code')
    # sid_verify_code = self.data.get('sid_verify_code')
    if int(verify_code) != int(s_verify_code):
        raise forms.ValidationError("验证码输入有误")
    return verify_code

猜你喜欢

转载自blog.csdn.net/weixin_43958804/article/details/86292458