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

Flask POST接口传单个参数触发KeyError问题求助

解决Flask /gifts接口仅传单个参数时的KeyError问题

问题原因

当前代码里直接用body["candy"]和body["chocolate"]从请求体中取值,当请求缺少其中一个键时,Python会直接抛出KeyError,后续的参数校验逻辑根本没机会执行。另外原代码中/candies接口的装饰器少了@符号,会导致接口无法正常注册,这也是需要修复的小问题。

修复方案

改用字典的get()方法获取参数,给未传入的参数设置默认值0(相当于不增加对应物品的数量),同时调整校验逻辑:只有当两个参数都为非正数时才返回错误,允许单个参数合法传入。

修改后的完整业务代码

from flask import Flask, current_app, request

def create_app():
    app = Flask(__name__)
    app.config["candies"] = 0
    app.config["chocolates"] = 0 

    return app

app = create_app()

@app.route("/candies", methods=["GET"])  # 补上缺失的@装饰器
def get_candies():
    candies = current_app.config["candies"]
    if candies == 1:
        return {"message" : f"I have {candies} candy"}, 200
    else:
        return {"message" : f"I have {candies} candies"}, 200

@app.route("/chocolates", methods=["GET"])
def get_chocolate():
    chocolates = current_app.config["chocolates"]
    if chocolates == 1:
        return {"message" : f"I have {chocolates} chocolate"}, 200
    else :
        return {"message" : f"I have {chocolates} chocolates"}, 200

@app.route("/gifts", methods=["POST"])
def gift():
    body = request.json or {}  # 处理请求体为空的边界情况
    cands = body.get("candy", 0)
    chocs = body.get("chocolate", 0)
    cur_chocs = current_app.config["chocolates"]
    cur_cands = current_app.config["candies"]
    
    # 校验:至少有一个参数是正整数
    if cands <= 0 and chocs <= 0:
        return {"error": "We need real candies and chocolates"}, 400
    
    fnl_chocs = cur_chocs + chocs 
    fnl_cands = cur_cands + cands
    current_app.config["chocolates"] = fnl_chocs
    current_app.config["candies"] = fnl_cands
    return {"message": "Gifts are well received!"}, 201

测试验证

修改后执行你的测试代码,会发现:

  • 仅传单个参数时不再触发KeyError
  • 对应物品的数量会正确累加(比如巧克力数量从3变为6)
  • 所有断言都会通过,最终输出Testing p2.py DONE!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:40:43