kafka avro反序列化,kafka为什么要对消息做序列化和反序列化处理-

  kafka avro反序列化,kafka为什么要对消息做序列化和反序列化处理?

  验证文章目录反序列化,保存反序列化

  使用序列化程序进行反序列化时,必须先验证数据,然后才能获取验证成功的数据或将数据保存为模型类对象。

  如上所述,在定义了Serializer类之后,您可以创建一个Serializer对象。

  序列化程序的构建如下。

  序列化程序(实例=无,数据=空,**kwarg )说明:

  1)当用于序列化时,模型类对象被传递给实例参数。

  2)当用于反序列化时,反序列化的数据被传递给data参数。

  3)除了实例和数据参数之外,以下上下文参数可用于在构造序列化程序对象时添加数据。

  由serializer=accountserializer(account,context={request: request})上下文参数附加的数据将显示在

  反序列化验证在检索反序列化的数据之前,必须调用is_valid)方法进行验证。如果验证成功,则返回True否则,它将返回False。

  如果验证失败,可以从serializer对象的errors属性中获取错误信息,并返回包含字段和字段错误的字典。对于非字段错误,可以通过更改REST框架配置中的NON_FIELD_ERRORS_KEY来控制错误字典的键名。

  验证成功。您可以从序列化程序对象的validated_data属性中检索数据。

  定义序列化程序时,为每个字段指定序列化类型和可选参数本身就是一种验证行为。

  前面定义的BookInfoSerializer构建了Serializer对象,并将要反序列化的数据传递给数据构造参数进行验证。

  要验证输入是否正确:

  from books . serializer importbookinfoserializer data={ bpub _ date :1234 } serializer=book info serializer(data=)

  验证正确:

  data={ btitle : python } serializer=book info serializer(data=data)serializer . is _ valid)# true serizer

  is_valid()方法也可以抛出异常序列化程序。验证失败时出现验证错误。可以通过传递raise_exception=True参数打开它,REST框架接收到这个异常并返回http400badreeeefort到前端。

  # return 400 responseifthedatawasinvalid . serializer . is _ valid(raise _ exception=true)如果你觉得这些还不够,就应该重新定义验证行为。

  1)validate_field_name

  验证field_name字段。例如,通过给书名添加约束。

  classbookinfoserializer(serializer . serializer):(“”。def validate _ btitle ) self,Value(3360 if django not invalue . lower):raise serializer . validation error(本书不涉及django))返回值

  from books . serializer importbookinfoserializer data={ btitle : python } serializer=book info serializer(data)

  2)validate

  如果序列化程序需要同时比较和验证多个字段,可以按如下方式定义和验证validate方法:

  classbookinfoserializer(serializer . serializer):

  MMT=attrs[ b comment ]if bread b comment:引发序列化程序。验证错误(“读数小于注释”)返回属性测试

  from books.serializers导入BookInfoSerializerdata={ btitle : about django , bread: 10, b comment :20 } s=BookInfoSerializer(data=data)s . is _ valid()# false s . errors

  3)validators

  在字段中添加validators选项参数也可以补充验证行为,例如

  def about _ Django(value):if Django not in value . lower():raieserializer . validation error( books not about Django )class info serializer(serializer . serializer): book data serializer id=serializer . integer field(label= id ,Read _ only=true)btitle=serializer . char field(label= name ,max _ length=20,validators=[about _ Django])bpub _ date=serializer . date field(label= release date ,Required=false) Bread=

  从书籍.连载导入BookInfoSerializerdata={ btitle : python } serializer=BookInfoSerializer(data=data)序列化程序。is _ valid()# False序列化程序。错误

  休息框架提供的验证者:

  UniqueValidator

  单字段唯一,如:

  从验证器导入UniqueValidatorslug=slug field(max _ length=100,validators=[unique validator(query set=blogpost。对象。all())])UniqueTogetherValidation

  联合唯一,如

  从验证器导入UniqueTogetherValidatorclass示例示例序列化程序.序列化程序):#.class Meta:validators=[UniqueTogetherValidator(查询集=todo项。对象。all()、fields=(list , position )]]反序列化之保存如果在验证成功后,想要基于已验证_数据完成数据对象的创建,可以通过实现创建()和更新()两个方法来实现。

  类BookInfoSerializer(序列化程序。序列化程序):""图书数据序列化器 .定义创建(自身,验证数据): 新建返回BookInfo(**validated_data)定义更新(自身、实例、validated_data):“”更新,实例为要更新的对象实例“”实例。b title=已验证的数据。get( b title ,实例。b标题)实例。bpub _ date=已验证的数据。get( bpub _ date ,实例。bpub _ date)实例。面包=已验证_数据。例如,get(面包)。bread)instance . b comment=validated _ data。get( b注释,实例。b评论)返回实例如果需要在返回数据对象的时候,也将数据保存到数据库中,则可以进行如下修改

  类BookInfoSerializer(序列化程序。序列化程序):""图书数据序列化器 .定义创建(自身,验证数据): 新建 返回图书信息。对象。创建(* *已验证数据)定义更新(自身,实例,验证数据): 更新,实例为要更新的对象实例“”实例。b title=已验证的数据。get( b title ,实例。b标题)实例。bpub _ date=已验证的数据。get( bpub _ date ,实例。bpub _ date)实例。面包=已验证_数据。例如,get(面包)。面包)实例。b注释=已验证_数据。get( b注释,实例。b注释)实例。保存()返回实例实现了上述两个方法后,在反序列化数据的时候,就可以通过保存()方法返回一个数据对象实例了

  book=serializer.save()

  如果创建序列化器对象的时候,没有传递情况实例,则调用保存()方法的时候,创建()被调用,相反,如果传递了情况实例,则调用保存()方法的时候,更新()被调用。

  如,没有传递情况实例,调用保存()方法的时候,创建()被调用的情况:

  从书籍.连载导入BookInfoSerializerdata={ b title :斗罗大陆, bpub _ date : 2012-12-02 } serializer=BookInfoSerializer(data=data)序列化程序。is _ valid()# true序列化程序。保存()

  如传递了情况实例,调用保存()方法的时候,更新()被调用的情况:

  从书籍.模型导入BookInfobook=bookinfo。对象。get(id=2)data={ b title :遮天} serializer=BookInfoSerializer(book,data=data)序列化程序。is _ valid()# true序列化程序。save()# BookInfo:遮天book.btitle # 遮天

  两点补充说明:

  1) 在对序列化器进行保存()保存时,可以额外传递数据,这些数据可以在创建()和更新()中的已验证_数据参数获取到:

  序列化程序。保存(所有者=请求。用户)2)默认序列化器必须传递所有需要的字段,否则会抛出验证异常。但是我们可以使用部分的参数来允许部分字段更新:

  #用部分数据序列化程序=CommentSerializer更新" comment "( comment,data={content: ufoo bar},partial=True)注意,如果用部分的参数来允许部分字段更新的前提是其他字段的额外验证也要满足要求才可以成功。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: