访问方式: GET /sms_codes/(?P<mobile>1[3-9]\d{9})/?image_code_id=xxx&text=xxx
前端
请求参数: 路径参数与查询字符串参数python
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
mobile | str | 是 | 手机号 |
image_code_id | uuid字符串 | 是 | 图片验证码编号 |
text | str | 是 | 用户输入的图片验证码 |
返回数据: JSONredis
返回值 | 类型 | 是否必传 | 说明 |
---|---|---|---|
message | str | 否 | OK,发送成功 |
视图原型:后端
# url('^sms_codes/(?P<mobile>1[3-9]\d{9})/$', views.SMSCodeView.as_view()), class SMSCodeView(GenericAPIView): """ 短信验证码 传入参数: mobile, image_code_id, text """ pass
在verifications/serializers.py中定义序列化器,用以校验dom
class ImageCodeCheckSerializer(serializers.Serializer): """ 图片验证码校验序列化器 """ image_code_id = serializers.UUIDField() text = serializers.CharField(max_length=4, min_length=4) def validate(self, attrs): """ 校验 """ image_code_id = attrs['image_code_id'] text = attrs['text'] # 查询真实图片验证码 redis_conn = get_redis_connection('verify_codes') real_image_code_text = redis_conn.get('img_%s' % image_code_id) if not real_image_code_text: raise serializers.ValidationError('图片验证码无效') # 删除图片验证码 try: redis_conn.delete('img_%s' % image_code_id) except RedisError as e: logger.error(e) # 比较图片验证码 real_image_code_text = real_image_code_text.decode() if real_image_code_text.lower() != text.lower(): raise serializers.ValidationError('图片验证码错误') # 判断是否在60s内 mobile = self.context['view'].kwargs['mobile'] send_flag = redis_conn.get("send_flag_%s" % mobile) if send_flag: raise serializers.ValidationError('请求次数过于频繁') return attrs
在verifications/views.py中定义实现视图:ui
class SMSCodeView(GenericAPIView): """ 短信验证码 """ serializer_class = serializers.ImageCodeCheckSerializer def get(self, request, mobile): """ 建立短信验证码 """ # 判断图片验证码, 判断是否在60s内 serializer = self.get_serializer(data=request.query_params) serializer.is_valid(raise_exception=True) # 生成短信验证码 sms_code = "%06d" % random.randint(0, 999999) # 保存短信验证码与发送记录 redis_conn = get_redis_connection('verify_codes') pl = redis_conn.pipeline() 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() # 发送短信验证码 sms_code_expires = str(constants.SMS_CODE_REDIS_EXPIRES // 60) ccp = CCP() ccp.send_template_sms(mobile, [code, expires], SMS_CODE_TEMP_ID) return Response({"message": "OK"})