Example #1
0
    def get(self, request, mobile):
        redis = get_redis_connection("sms_codes")
        # 获取短信发送间隔
        try:
            interval = redis.get("%s_interval" % mobile)
            if interval:
                print(interval)
                return JsonResponse({'result': '-1'})
        except:
            pass

        ccp = CCP()
        sms_codes = "%04d" % random.randint(1, 9999)
        result = ccp.send_template_sms(mobile, [sms_codes, 5], 1)

        if not result:
            """发送成功"""
            redis.setex("%s_sms_codes" % mobile, 5 * 60, sms_codes)
            # 这里的值不重要,重要的是这个变量是否在redis被查找到
            redis.setex("%s_interval" % mobile, 60, 1)

        return JsonResponse({"result": result})
Example #2
0
    def post(self, request):
        '''

        - 发送短信
        - 保存这个短信验证码(保存在哪里?)
        - 保存发送记录
        :param request:
        :return:
        '''
        form = CheckImageForm(request.POST, request=request)
        if form.is_valid():
            # success
            # 获取手机号码
            mobile = form.cleaned_data.get('mobile')
            # 生成短信验证码
            sms_code = ''.join([
                random.choice('0123456789')
                for _ in range(constants.SMS_CODE_LENGTH)
            ])
            # 发送短信验证码,调用接口
            # ..........
            # 保存发送记录
            # logger.info('发送短信验证码[正常][mobile: %s sms_code: %s]' % (mobile,sms_code))
            ccp = CCP()
            try:
                res = ccp.send_template_sms(
                    mobile, [sms_code, constants.SMS_CODE_EXPIRES], "1")
                if res == 0:
                    logger.info('发送短信验证码[正常][mobile: %s sms_code: %s]' %
                                (mobile, sms_code))
                else:
                    logger.error('发送短信验证码[失败][moblie: %s sms_code: %s]' %
                                 (mobile, sms_code))
                    return json_response(errno=Code.SMSFAIL,
                                         errmsg=error_map[Code.SMSFAIL])
            except Exception as e:
                logger.error('发送短信验证码[异常][mobile: %s message: %s]' %
                             (mobile, e))
                return json_response(errno=Code.SMSERROR,
                                     errmsg=error_map[Code.SMSERROR])
            # 保存这个验证码 这里有个时限的问题
            # 两种方案:1、session  2、redis (不保存在MySQL是因为MySQL效率太低)
            # 但session的时限是统一设置的,这里如果重新设置时限,会把前面的session覆盖,因此排除session方案,用redis保存验证码
            # request.session['sms_code'] = sms_code
            # request.session.set_expiry
            # 60秒记录
            # 5分钟有效
            # 创建短信验证码发送记录的key
            sms_flag_key = 'sms_flag_{}'.format(mobile)
            # 创建短信验证码内容的key
            sms_text_key = 'sms_text_{}'.format(mobile)
            redis_coon = get_redis_connection(alias='verify_codes')
            # 创建一个管道
            pl = redis_coon.pipeline()
            try:
                pl.setex(sms_flag_key, constants.SMS_CODE_INTERVAL, 1)
                pl.setex(sms_text_key, constants.SMS_CODE_EXPIRES * 60,
                         sms_code)
                # 让管道通知redis执行命令
                pl.execute()
                return json_response(errmsg='短信验证码发送成功')
            except Exception as e:
                logger.error('redis 执行异常, {}'.format(e))
                return json_response(errno=Code.UNKOWNERR,
                                     errmsg=error_map[Code.UNKOWNERR])
        else:
            # fail
            # 将表单的报错信息进行拼接
            err_msg_list = []
            for item in form.errors.values():
                # item是一个列表,
                err_msg_list.append(item[0])
            err_msg_str = '/'.join(err_msg_list)
            return json_response(errno=Code.PARAMERR, errmsg=err_msg_str)