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

