Flask应用调用/recms POST接口返回400错误的原因及解决方法
问题根本原因
请求传递的JSON参数键名与代码中预期的键名不匹配:
- 代码中从请求JSON里读取的键为
title(movie = data["title"]) - 实际curl请求中传递的键为
movie_title({"movie_title":"Heat (1995)"})
这种不匹配会导致代码尝试访问不存在的键,同时由于该操作未被异常捕获,最终触发Flask返回400错误请求。
修复方案
有两种直接的修复方式,任选其一即可:
方式一:修改代码适配请求参数
将代码中读取参数的键名改为movie_title,同时把参数读取逻辑纳入异常捕获范围,避免参数缺失引发未处理异常:
@app.route("/recms", methods = ["POST"]) def make_rec(): if request.method == "POST": data = request.json try: movie = data["movie_title"] # 匹配请求中的键名 similar_score = item_similarity_df[movie] similar_movies = similar_score.sort_values(ascending=False)[1:50] api_recommendations = similar_movies.index.to_list() except KeyError: api_recommendations = ['缺少电影标题参数'] except Exception: api_recommendations = ['未找到该电影'] return {"rec_movie":api_recommendations}
方式二:修改curl请求适配代码
调整curl命令的JSON参数,将键名改为title:
curl -X POST http://192.168.1.106:80/recms -H 'Content-Type: application/json' -d '{"title":"Heat (1995)"}'
额外优化建议
为增强接口健壮性,建议增加对请求JSON格式的校验,避免因请求未正确传递JSON导致的异常:
@app.route("/recms", methods = ["POST"]) def make_rec(): if request.method == "POST": data = request.json if not data: return {"rec_movie": ["无效的JSON请求"]}, 400 try: movie = data["title"] # 或对应修改后的movie_title similar_score = item_similarity_df[movie] similar_movies = similar_score.sort_values(ascending=False)[1:50] api_recommendations = similar_movies.index.to_list() except KeyError: api_recommendations = ['缺少必填参数:title'] except Exception: api_recommendations = ['未找到该电影'] return {"rec_movie":api_recommendations}
内容的提问来源于stack exchange,提问作者Ren Ping Ong
相关产品推荐
相关产品推荐

