Example #1
0
    def get(self, request):
        """
        获取access_token生成的短信验证码
        :param request: 请求对象
        :return: message
        """
        access_token = request.query_params.get('access_token')
        if not access_token:
            return Response({'message': '缺少access_token'}, status=status.HTTP_400_BAD_REQUEST)

        mobile = User.check_send_sms_token(access_token)
        if not mobile:
            return Response({'message': '无效的access_token'}, status=status.HTTP_400_BAD_REQUEST)

        redis_conn = get_redis_connection('verify_codes')
        send_flag = redis_conn.get('send_flag_%s' % mobile)
        if send_flag:
            raise Response({"message": "发送短信次数过于频"}, status=status.HTTP_429_TOO_MANY_REQUESTS)

        sms_code = str('%06d' % randint(0, 999999))
        print('sms_code:%s' % sms_code)

        redis_conn = get_redis_connection('verify_codes')
        pl = redis_conn.pipeline()
        # TODO:这是做什么用的?
        pl.multi()
        # 解决:验证码不是发送成功才往redis存吗?==>同步耗时任务,用户体验差
        pl.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
        pl.setex('send_flag_%s' % mobile, constants.SMS_CODE_REDIS_INTERVAL, 1)
        pl.execute()

        # send_sms_code.delay(mobile, sms_code)

        return Response({'message': '发送成功'}, status=status.HTTP_200_OK)
Example #2
0
 def get(self, request):
     # 获取校验access_token
     access_token = request.query_params.get('access_token')
     # 如果token不存在
     if not access_token:
         return Response({"messsge": "缺少access token"},
                         status=status.HTTP_400_BAD_REQUEST)
     # 从access_token中取出手机号码
     mobile = User.check_send_sms_token(access_token)
     if mobile is None:
         return Response({"messsge": "无效的access token"},
                         status=status.HTTP_400_BAD_REQUEST)
     # 判断手机号码发送短信的次数,查看redis中是否有发送过短信的标志
     redis_conn = get_redis_connection("verify_codes")
     send_flag = redis_conn.get('send_flag_%s' % mobile)
     if send_flag:
         return Response({"messsge": "发送短信过于频繁"},
                         status=status.HTTP_429_TOO_MANY_REQUESTS)
     # 生成短信验证码
     sms_code = '%06d' % random.randint(0, 999999)
     # 发送短信验证码
     pl = redis_conn.pipeline()
     pl.setex('sms_%s' % mobile, constants.IMAGE_CODE_REDIS_EXPRIES,
              sms_code)
     pl.setex('send_flag_%s' % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
     pl.execute()
     logger.info('%s的验证码是:%s' % (mobile, sms_code))
     # 使用celery发布异步任务
     send_sms_code.delay(mobile, sms_code)
     # 返回
     return Response({'message': 'OK'})