短信验证码后端逻辑实现
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()