React+Flask Todo更新功能报错:TypeError与422状态码求助
解决Flask+React待办应用更新功能的TypeError与422错误
问题分析
- TypeError 触发原因:Flask蓝图的
@blp.arguments装饰器会将解析后的请求体数据作为视图函数的第一个参数(类视图中紧跟self),你当前的函数参数顺序(self, todo_id, todo_data)颠倒了,导致URL路径中的todo_id与装饰器注入的参数冲突,触发got multiple values for argument 'todo_id'错误。 - 422状态码:通常是请求数据不符合Schema验证规则,也可能是TypeError引发的连锁问题。
修复步骤
1. 调整Flask视图函数参数顺序
将todo_data放在todo_id之前,匹配装饰器的参数注入逻辑:
@blp.arguments(TodoUpdateSchema) @blp.response(200, TodoSchema) def put(self, todo_data, todo_id): # 交换todo_data和todo_id的位置 todo = TodoModel.query.get(todo_id) if todo: todo.todo = todo_data["todo"] todo.checked = todo_data["checked"] else: return {"message": "todo not found"}, 404 # 补充404状态码,符合REST规范 db.session.add(todo) db.session.commit() return todo
2. 验证请求数据与Schema匹配
确保React传入的editTodo对象包含todo(字符串类型)和checked(布尔类型)两个必填字段,完全匹配TodoUpdateSchema的要求,避免因字段缺失或类型错误触发422验证失败:
// 确认前端EditTodo类型定义正确 interface EditTodo { todo: string; checked: boolean; }
内容的提问来源于stack exchange,提问作者Lena
相关产品推荐
相关产品推荐

