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

Flask+React项目中Pydantic验证报错:Payload属性存在仍提示缺失

问题:Flask+React项目中Pydantic验证Payload时出现属性缺失错误

在Flask+React项目中,使用Pydantic对前端Payload进行验证,定义了PersonsSchema、TagSchema、UpdatedActionSchema等验证模型。但在PUT接口处理Payload时,明明打印的Payload包含所有必填属性,却收到属性缺失的验证错误。相关代码及Payload示例如下:

验证模型代码

class PersonsSchema(BaseModel):
    id = str
    name: Optional[str]
    lastName: Optional[str]


class TagSchema(BaseModel):
    name: Optional[str]
    id: str


class UpdatedActionSchema(BaseModel):
    id: str
    description: str
    action: str
    category: str
    tag: TagSchema
    persons: Optional[List[PersonsSchema]] = None

后端PUT接口代码

@blp.route('/action/<string:actionId>', methods=['GET', 'PUT'])
def get_action(actionId):
    id = actionId

    if request.method == 'PUT':
        data = request.json
        key_to_lookup = 'id'
        for person in data['persons']:
            if key_to_lookup not in person:
                person['id'] = str(uuid.uuid4())
        print(f"data:{data}")
        actions_schema = UpdatedActionSchema()
        try:
            actions_schema.parse_obj(data)
        except ValueError as e:
            return jsonify({'error': str(e)}), 400

打印的Payload内容

data:
    {
        'action': 'asd',
        'category': 'asd',
        'description': 'asd',
        'id': '64c728b8-ba61-4038-890e-caadb79a5548',
        'persons': 
            [
            {
                'id': 'e01c8916-0d82-4155-a1b8-a55ded7c1674',
                'lastName': 'zzz',
                'name': 'aaa'
                },
            {
                'name': '',
                'lastName': '',
                'id': '84155298-dd72-490c-bc9a-4f72c8d7cd2f'
            }
    ],
    'tag': 
        {
            'action_id': '64c728b8-ba61-4038-890e-caadb79a5548',
            'id': '56d6c9ca-695f-45bb-aa00-319aa788b985',
            'name': 'asd'
        }
}

问题原因及解决方案

1. PersonsSchema中id字段定义错误

你在PersonsSchema里把id写成了id = str,这是普通的类属性赋值,不是Pydantic的字段声明方式。Pydantic只会识别带类型注解的字段,这种写法下id不会被当作验证字段,导致验证逻辑认为该属性缺失。

修正后的PersonsSchema:

class PersonsSchema(BaseModel):
    id: str  # 改为类型注解形式
    name: Optional[str]
    lastName: Optional[str]

2. 验证代码写法错误

你先实例化空的UpdatedActionSchema()再调用parse_obj,这是冗余且错误的用法。Pydantic的parse_obj是类方法,直接通过类调用即可。

修正后的验证代码:

try:
    # 直接通过类调用parse_obj,无需提前实例化
    actions_schema = UpdatedActionSchema.parse_obj(data)
except ValidationError as e:  # 捕获Pydantic专属的ValidationError
    return jsonify({'error': e.errors()}), 400

3. 异常捕获类型错误

原代码捕获ValueError,但Pydantic验证失败抛出的是ValidationError,需要从pydantic导入该异常类才能拿到准确的错误详情。

总结

核心问题是PersonsSchema中id字段的定义不符合Pydantic规范,导致验证逻辑未正确识别必填字段。同时修正验证代码的调用方式和异常捕获类型,即可解决属性缺失的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:22:49