APIFlask 如何把空数据(比如返回 None)序列化为 null 而不是 {} ?

帖子里面添加 github 仓库的链接会被标记为广告

顶一个! :+1: :smiley:
这个问题的原因应该是在output函数里面序列化产生的,如果不使用output函数,是可以正常序列化为null,但如果return None 如果可以序列化成null会更好。

麻烦提供一个可以复现问题的最小示例。

demo 地址
期望接口返回

{
  "code": 1000,
  "data": null,
  "message": "Get pet successfully."
}

或者

{
  "code": 1000,
  "message": "Get pet successfully."
}

目前返回

{
  "code": 1000,
  "data": {},
  "message": "Get pet successfully."
}

清楚了,多谢。我来看看怎么处理比较好。

这个行为是 marshmallow 序列化的默认行为,我认为返回空字典是合理的行为,因为你使用 output 装饰器声明了使用某个模式去序列化返回值。如果想要返回 null 的话,可以这样实现:

from marshmallow import post_dump

class PetOutSchema(Schema):

    @post_dump
    def return_none(self, data, **kwargs):
        if data == {}:
            return None

相关 issue:

这样解决了序列化结果里面的 data 问题,但是 api 文档里面 data 的问题没解决
image
customize base response schema ,这个功能挺实用的,因为能减少 Schema 要嵌套写的麻烦,但是 data 这个问题确实比较遗憾,如果能想办法再处理一下会更好

帖子和回复内容里面有 github 链接,会被社区标记隐藏

文档里估计目前只能手动处理,使用 app.spec_processor 装饰器注册一个函数来更新。

(帖子恢复了)