【问题标题】:Flask restx model nested wildcard dictFlask restx 模型嵌套通配符字典
【发布时间】:2020-12-03 02:17:28
【问题描述】:

我想知道我是否只是一个在为此类问题苦苦挣扎的人。

我们以 dict 为例:

data = {'totalSize': 3000, 'freq': 2400,
        'distribution':
            {'ram1': {'size': 200, 'status': 'OK'},
             'ram2': {'size': 100, 'status': 'OK'}
             }
        }

请注意 ram1/2 是动态键,无法提前知道

问题,我的 api.model 应该是什么样子?我有:

wild = {"*": fields.Wildcard(fields.String())}
hw_memory = api.model('Memory', {
    'totalSize': fields.Integer(description='total memory size in MB',
                                example=1024),
    'freq': fields.Integer(description='Speed of ram in mhz', example=800),
    'distribution': fields.Nested(wild),
})

它正在工作,但它不会验证“分发”以下的任何内容,换句话说,它像通配符一样工作,任何东西都将被接受。 有没有办法以通配符动态键的方式嵌套字典?

【问题讨论】:

    标签: python flask flask-restx


    【解决方案1】:

    首先,Wildcard 类型的字段接受 dict 值的定义,而不是键的定义,即 fields.Wildcard(fields.String()) 验证 dict 值只能是字符串类型(在您的情况下,您需要提供分布的定义)。

    第二个错误是您将distribution 字段定义为Nested 对象,而不是使用Wilcard

    以下代码应用于验证目的:

    
    DISTRIBUTION_MODEL = NAMESPACE.model("Distribution", dict(
        size=fields.Integer(),
        status=fields.String(),
    ))
    
    MEMORY_MODEL = NAMESPACE.model("Memory", dict(
        totalSize=fields.Integer(description='total memory size in MB',
                                 example=1024),
        freq=fields.Integer(description='Speed of ram in mhz', example=800),
        distribution=fields.Wildcard(fields.Nested(DISTRIBUTION_MODEL))
    ))
    

    不幸的是,它不适用于编组。 下一个代码应该适用于封送处理,但不适用于验证输入负载:

    
    OUTPUT_MEMORY_MODEL = NAMESPACE.model("OutputMemory", dict(
        totalSize=fields.Integer(description='total memory size in MB',
                                 example=1024),
        freq=fields.Integer(description='Speed of ram in mhz', example=800),
        distribution=flask_utils.fields.Nested(
            NAMESPACE.model(
                "distributions", {
                    "*": fields.Wildcard(
                        # DISTRIBUTION_MODEL is taken from previous snippet
                        fields.Nested(DISTRIBUTION_MODEL)
                    )
                }
            )
        )
    ))
    

    【讨论】:

    • update 我删除了评论,因为这是我的愚蠢错误(将模型传递给 marshal() 在错误的地方。无论如何 - 问题仍然有效,您提供的解决方案没有'在嵌套字典中没有通配符 KEY,如果我尝试用这个模型编组,我得到 "{"totalSize": 12, "freq": 2400, "distribution": {"size": null, "status": null }}" 不对,应该是 "{"totalSize": 12, "freq": 2400, "distribution": {'ram1': {"size": null, "status": null}}}
    • 您在问题中没有提及编组:) 以下 sn-p 适用于验证输入数据。奇怪的是,相同的模型不适用于编组。听起来像 flask-restx 的错误。我唯一可以建议的 - 提供 2 种不同的验证和封送模型(我用有效的封送模型更新了回复)
    • 感谢安德烈,你帮了大忙!
    猜你喜欢
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多