实现序列化,需要继承serializers.Serializer序列化器的方法。
from rest_framework import serializers
class MsgCodeSerializer(serializers.Serializer):
imagecode_id=serializers.UUIDField()
image_string=serializers.CharField(max_length=4,min_length=4)
def validate(self, data):
print('传递过来的数据',data)
imagecode_id=data['imagecode_id']
image_string=data['image_string']
print(type(imagecode_id))
con=get_redis_connection()
true_string=con.get(str(imagecode_id))
print('验证图片的真正字符串',true_string)
if not true_string:
raise serializers.ValidationError('raise取出验证码文字错误')
print('数据库去处的字符格式',type(true_string))
print('这是传递过来的图片文字',type(image_string))
if image_string != true_string.decode():
raise serializers.ValidationError('验证未通过')
else:
print('验证通过')
return data
调用自定义化序列化器类;就行数据校验:
class MsgCodeView(APIView):
def get(self,request,phone):
print(request.GET)
print(request.query_params)
# serializer = MsgCodeSerializer()
# 检验参数
ser = MsgCodeSerializer(data=request.query_params)
ser.is_valid(raise_exception=True) #返回TRUE,表示校验成功,否则没有校验成功,
结果成功:
<QueryDict: {'imagecode_id': ['db7c5517-ccae-487f-9fb3-a2043fbd5cd0'], 'image_string': ['C3A4']}>
<QueryDict: {'imagecode_id': ['db7c5517-ccae-487f-9fb3-a2043fbd5cd0'], 'image_string': ['C3A4']}>
传递过来的数据 OrderedDict([('imagecode_id', UUID('db7c5517-ccae-487f-9fb3-a2043fbd5cd0')), ('image_string', 'C3A4')])
<class 'uuid.UUID'>
验证图片的真正字符串 b'C3A4'
数据库去处的字符格式 <class 'bytes'>
这是传递过来的图片文字 <class 'str'>
验证通过
True
423559
ok
其中自定义序列化类中有方法validate(),在实例化类的时候调用该方法,不需要用validate(),仅仅实例对象.is_valide()返回真与假值即可。