Flask项目(新闻网站)—— 项目配置(三)

短信验证码

前期准备

在这里插入图片描述
首先进入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了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值