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
相关产品推荐
相关产品推荐

