• 手机验证码


    短信验证码后端逻辑实现

    class SMSCodeView(View):
        """短信验证码"""
    
        def get(self, reqeust, mobile):
            """
            :param reqeust: 请求对象
            :param mobile: 手机号
            :return: JSON
            """
            # 接收参数
            image_code_client = reqeust.GET.get('image_code')
            uuid = reqeust.GET.get('uuid')
    
            # 校验参数
            if not all([image_code_client, uuid]):
                return http.JsonResponse({'code': RETCODE.NECESSARYPARAMERR, 'errmsg': '缺少必传参数'})
    
            # 创建连接到redis的对象
            redis_conn = get_redis_connection('verify_code')
            # 提取图形验证码
            image_code_server = redis_conn.get('img_%s' % uuid)
            if image_code_server is None:
                # 图形验证码过期或者不存在
                return http.JsonResponse({'code': RETCODE.IMAGECODEERR, 'errmsg': '图形验证码失效'})
            # 删除图形验证码,避免恶意测试图形验证码
            try:
                redis_conn.delete('img_%s' % uuid)
            except Exception as e:
                logger.error(e)
            # 对比图形验证码
            image_code_server = image_code_server.decode()  # bytes转字符串
            if image_code_client.lower() != image_code_server.lower():  # 转小写后比较
                return http.JsonResponse({'code': RETCODE.IMAGECODEERR, 'errmsg': '输入图形验证码有误'})
    
            # 生成短信验证码:生成6位数验证码
            sms_code = '%06d' % random.randint(0, 999999)
            logger.info(sms_code)
            # 保存短信验证码
            redis_conn.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
            # 发送短信验证码
            CCP().send_template_sms(mobile,[sms_code, constants.SMS_CODE_REDIS_EXPIRES // 60], constants.SEND_SMS_TEMPLATE_ID)
    
            # 响应结果
            return http.JsonResponse({'code': RETCODE.OK, 'errmsg': '发送短信成功'})

    1. 避免频繁发送短信验证码逻辑分析

    避免频繁发送短信验证码逻辑实现

    1.提取、校验send_flag

    send_flag = redis_conn.get('send_flag_%s' % mobile)
    if send_flag:
        return http.JsonResponse({'code': RETCODE.THROTTLINGERR, 'errmsg': '发送短信过于频繁'})

    2.重新写入send_flag

    # 保存短信验证码
    redis_conn.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
    # 重新写入send_flag
    redis_conn.setex('send_flag_%s' % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)

    3.界面渲染频繁发送短信提示信息

    if (response.data.code == '4001') {
        this.error_image_code_message = response.data.errmsg;
        this.error_image_code = true;
    } else { // 4002
        this.error_sms_code_message = response.data.errmsg;
        this.error_sms_code = true;
    }

    pipeline操作Redis数据库

    1.实现步骤

    1. 创建Redis管道
    2. 将Redis请求添加到队列
    3. 执行请求
    
    

    2.代码实现

    # 创建Redis管道
    pl = redis_conn.pipeline()
    # 将Redis请求添加到队列
    pl.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
    pl.setex('send_flag_%s' % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
    # 执行请求
    pl.execute()
    
    
  • 相关阅读:
    c# 时间戳转换为Datetime类型的时间
    WCF小白初试 错误之一:“有零个应用程序终结点”的解决办法
    对html制作新手的一些建议,大牛可以忽略
    Aspose.Words导出dt到word的问题
    获取checkboxlist选中的值以及绑定来自之前选中的来自数据库的值
    excel导入mssql数据库,支持excel2003--2010文件格式
    vscode调试angular
    asp.net web api 跨域问题
    WPF 完美截图 <二>
    EF错误
  • 原文地址:https://www.cnblogs.com/csp813/p/14778629.html
Copyright © 2020-2023  润新知