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)
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'})