zoukankan      html  css  js  c++  java
  • 手机验证码

    短信验证码后端逻辑实现

    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()
    
    
  • 相关阅读:
    IOS
    .net程序集强命名(签名)
    spring.net Corn表达式[转]
    SQLite日期类型【转】
    Use SQLite Instead of Local Storage In Ionic Framework【转】
    VS常用快捷键
    安装ASP.net mvc3 Installation failed with error code: (0x80070643), "安装时发生严重错误 "
    支付宝支付(沙箱环境相关配置)
    如何在Windows远程服务器中引入本地磁盘
    设计模式-策略模式
  • 原文地址:https://www.cnblogs.com/csp813/p/14778629.html
Copyright © 2011-2022 走看看