You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask-RESTPlus/Flask-RESTX的请求体中定义通用字典模型?

可以实现!用Flask-RESTX的Schema Model结合JSON Schema搞定

你遇到的问题我之前也碰过——Flask-RESTX默认的模型定义只支持固定键的结构,直接用{fields.String: fields.List(...)}肯定行不通,因为它要求键是具体的字段名称,不是字段类型。不过咱们可以用JSON Schema的patternProperties特性来实现任意字符串键的字典,同时保证值是类型统一的字符串/数字数组,正好匹配你的需求。

具体实现步骤

1. 用api.schema_model定义符合要求的Schema

咱们直接基于JSON Schema来构建模型,利用patternProperties匹配所有字符串键,再通过oneOf和additionalItems约束数组元素的类型一致性:

from flask import Flask
from flask_restx import Api, Resource

app = Flask(__name__)
api = Api(app)

# 定义核心的JSON Schema规则
arbitrary_dict_schema = {
    "type": "object",
    # 匹配所有字符串键(^.*$ 表示任意字符组合)
    "patternProperties": {
        "^.*$": {
            "type": "array",
            # 数组元素只能是字符串或数字二选一
            "items": {
                "oneOf": [
                    {"type": "string"},
                    {"type": "number"}
                ]
            },
            # 强制数组内所有元素类型一致(不允许混合字符串和数字)
            "additionalItems": False
        }
    },
    # 禁止出现不符合patternProperties的键(可选,根据你的需求调整)
    "additionalProperties": False
}

# 把Schema转换成Flask-RESTX能识别的模型
arbitrary_dict_model = api.schema_model('ArbitraryDict', arbitrary_dict_schema)

2. 在API资源中使用这个模型

接下来就可以像普通模型一样在接口里使用它了,比如接收POST请求:

@api.route('/submit-data')
class DataSubmitResource(Resource):
    @api.expect(arbitrary_dict_model, validate=True)
    def post(self):
        # 获取验证后的请求数据
        received_data = api.payload
        return {"status": "success", "received": received_data}, 200

if __name__ == '__main__':
    app.run(debug=True)

效果验证

这样定义后:

  • 合法的请求会被正常接收:比如 {"some_key": ["v1", "v2"], "another_key": [1,2,3,4]}
  • 不合法的请求会被自动拦截:比如混合类型数组 {"bad_key": ["v1", 2]} 或者非数组值 {"wrong_val": "not an array"}

而且Swagger文档也会正确展示这个模型的结构,前端开发能清楚看到接口的参数要求。

之前你尝试api.schema_model没成功,大概率是Schema的规则写得不对,比如没正确用patternProperties来匹配任意键,或者没约束数组元素的类型一致性。按上面的代码来写应该就能解决问题啦~

内容的提问来源于stack exchange,提问作者mibm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 12:52:33