Flask Restx中如何创建字典类型api.model?求解决方案
Flask Restx 实现字典类型API模型
需求回顾
你需要API返回以设备主机名为键、设备信息字典为值的结构,且不想使用List类型。目标返回格式如下:
{ "sandbox-iosxe-recomm-1.cisco.com": { "username": "developer", "password": "cisco", "protocol": "ssh", "port": 22, "os_type": "iosxe" }, "sandbox-iosxr-1.cisco.com": { "username": "admin", "password": "cisco", "protocol": "ssh", "port": 22, "os_type": "iosxr" } }
解决步骤
1. 定义单个设备的详细模型
先把单台设备的字段封装成一个嵌套模型:
device_detail_model = api.model('DeviceDetail', { 'username': fields.String(required=True, description='用户名', default='device username'), 'password': fields.String(required=True, description='密码', default='device password'), 'protocol': fields.String(required=True, description='协议', default='protocol name'), 'port': fields.Integer(required=True, description='端口', default=22), 'os_type': fields.String(required=True, description='操作系统类型', default='device OS type'), })
2. 创建支持动态键的字典模型
用fields.Dict来实现任意字符串作为键,值对应上面的设备详细模型:
devices_model = api.model('Devices', { '*': fields.Nested(device_detail_model, description='设备主机名作为键,对应设备信息') })
这里的'*'代表允许任意字符串作为键,每个键对应的值都要符合device_detail_model的结构。
3. 在接口中使用模型
在路由里返回符合结构的数据,并通过marshal_with指定模型:
@api.route('/devices') class Devices(Resource): @api.marshal_with(devices_model) def get(self): return { "sandbox-iosxe-recomm-1.cisco.com": { "username": "developer", "password": "cisco", "protocol": "ssh", "port": 22, "os_type": "iosxe" }, "sandbox-iosxr-1.cisco.com": { "username": "admin", "password": "cisco", "protocol": "ssh", "port": 22, "os_type": "iosxr" } }
原写法问题分析
你之前的模型用了固定键'device',只能生成单条设备的结构,没法支持动态主机名作为键。而fields.Dict配合嵌套模型正好解决了动态键的需求,完全匹配你想要的返回格式。
内容的提问来源于stack exchange,提问作者Muhammad Rafi
相关产品推荐
相关产品推荐

