Postman发送POST请求时脑卒中预测Flask API出现500错误
问题分析与修复方案
核心错误点
- 装饰器绑定格式错误:
@app.route('/predict',methods=['POST'])下方的注释缩进异常,导致装饰器未正确绑定到predict函数,这是触发500错误的直接原因。 - 输入特征缺失:构造预测输入数组
input_query时遗漏了work_type参数,模型训练时的特征数量与预测输入不匹配,引发维度错误。 - 数据类型不匹配:通过
request.form.get()获取的参数均为字符串类型,而模型需要数值/编码后的特征值,直接传入会导致预测逻辑崩溃。 - 潜在模型路径问题:加载模型时使用相对路径
'Stroke.pkl',若脚本运行目录与模型文件所在目录不一致,会导致模型加载失败。
修正后的代码
from flask import Flask, request, jsonify import pickle import numpy as np # 优先使用绝对路径加载模型,避免路径问题 try: model = pickle.load(open('Stroke.pkl','rb')) except FileNotFoundError: raise Exception("模型文件Stroke.pkl未找到,请检查路径") app = Flask(__name__) @app.route('/') def home(): return "Stroke Disease Prediction App" # 装饰器直接绑定函数,注释移至函数内部 @app.route('/predict',methods=['POST']) def predict(): # 预期输入特征:gender,age,hypertension,heart_disease,ever_married,work_type,Residence_type,avg_glucose_level,bmi,smoking_status try: # 将参数转换为模型训练时要求的数据类型(需与训练时的编码规则一致) gender = int(request.form.get('gender')) age = float(request.form.get('age')) hypertension = int(request.form.get('hypertension')) heart_disease = int(request.form.get('heart_disease')) ever_married = int(request.form.get('ever_married')) work_type = int(request.form.get('work_type')) # 补充缺失的特征 Residence_type = int(request.form.get('Residence_type')) avg_glucose_level = float(request.form.get('avg_glucose_level')) bmi = float(request.form.get('bmi')) smoking_status = int(request.form.get('smoking_status')) # 构造与模型训练时完全匹配的特征输入数组 input_query = np.array([[gender, age, hypertension, heart_disease, ever_married, work_type, Residence_type, avg_glucose_level, bmi, smoking_status]]) result = model.predict(input_query)[0] return jsonify({'Stroke_Disease': str(result)}) except Exception as e: # 返回具体错误信息便于调试 return jsonify({'error': str(e)}), 400 if __name__=='__main__': app.run(debug=True)
额外注意事项
- 特征编码一致性:确保Postman传入的分类参数(如gender、work_type等)的编码与模型训练时使用的编码完全一致,比如gender若训练时用0代表男、1代表女,Postman需传递对应数值。
- Postman请求格式:选择
form-data或x-www-form-urlencoded格式传递参数,与代码中request.form.get()的获取方式匹配。 - 调试模式利用:Flask的debug模式会在控制台输出详细错误栈,可快速定位剩余问题。
内容的提问来源于stack exchange,提问作者Hezron mphande
相关产品推荐
相关产品推荐

