Flask POST请求报BadRequestKeyError:'items' 400错误排查
报错核心原因
- 请求数据解析方法使用错误:代码中用
request.form读取POST参数,但request.form仅能解析application/x-www-form-urlencoded、multipart/form-data类型的表单提交数据,你在Postman中发送的是application/json格式的原始JSON载荷,Flask不会把JSON数据解析到request.form中,因此访问data["items"]时会直接触发KeyError。 - 代码存在缺失导入问题:当前仅从flask导入了
Flask和jsonify,没有导入处理请求必需的request对象,运行时会额外触发NameError。 - 业务变量未初始化:代码中直接遍历的
groups变量没有提前定义,修复前两个问题后也会触发NameError。
修复方案
- 补全flask模块导入项,加入
request对象。 - 替换请求数据解析逻辑,使用
request.get_json()解析JSON格式的请求体,该方法会自动把传入的JSON结构转为Python字典/列表供业务逻辑调用。 - 增加基础参数校验逻辑,避免请求缺字段、格式错误时直接抛出服务端异常。
- 在路由定义前初始化
groups存储结构,匹配现有业务逻辑的调用需求。
修改后的可运行参考代码:
from flask import Flask, jsonify, request app = Flask(__name__) # 初始化groups存储结构,可根据实际业务逻辑替换存储方式 groups = [] @app.route("/expenses/<string:group_name>/add", methods = ["POST"]) def add_expenses(group_name): """ Add new expense to group. """ # 解析JSON请求体,silent=True表示解析失败时返回None而非直接抛错 data = request.get_json(silent=True) if not data: return {"msg": "请求格式错误,请传入合法JSON载荷"}, 400 """ Code block gets the List of all members in expense. """ members = [] # 必要字段校验 if "items" not in data or "name" not in data: return {"msg": "缺少必要参数name或items"}, 400 for item in data["items"]: for member in item['paid_by'][0]: members.append(member) for member in item['owed_by'][0]: members.append(member) """ Code block checks if Group, expense exists. If expense with same name doesn't exists add new expense to group. Update the members of the group. """ for group in groups: if group.name == group_name: for expense in group.expenses: if expense['name'] == data['name']: return {"msg": "Expense with name already exists"}, 400 group.add_expense(data) group.set_members(set(members)) return {"method": "Expense added successfully"} return {"method": "Group does not exist"}, 404 if __name__=="__main__": app.run(debug=True)
请求配置校验
Postman发请求时保持现有配置即可:选择Body-raw选项,右侧下拉菜单选中JSON类型,传入符合结构的JSON参数就能正常被接口解析。
内容的提问来源于stack exchange,提问作者Black Knight
相关产品推荐
相关产品推荐

