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

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。
修复方案
  1. 补全flask模块导入项,加入request对象。
  2. 替换请求数据解析逻辑,使用request.get_json()解析JSON格式的请求体,该方法会自动把传入的JSON结构转为Python字典/列表供业务逻辑调用。
  3. 增加基础参数校验逻辑,避免请求缺字段、格式错误时直接抛出服务端异常。
  4. 在路由定义前初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:09:19