Flask中render_template传递多值失败?代码问题排查咨询
问题分析与解决方案
你的程序只返回第一个值的根本原因不是render_template不支持迭代对象,而是returnResult函数里的return output缩进错误——它被放在了for循环内部,导致循环第一次执行就直接返回,后续迭代根本没机会运行。
修正步骤
1. 修复return语句的缩进
把return output移到for循环外面,让循环完整遍历4次后再返回整个列表:
def returnResult(): output = [] for K in range(0, 4): output.append(f"{prediction[K]} = {recall(actual, prediction, K)}") # 将return移至循环外部,确保所有元素都被添加 return output
2. 可选:优化召回率计算的K值逻辑
注意你的K从0开始时,pred_IT[:0]是空集合,召回率会固定为0。如果需要计算Top1到Top4的召回率,建议把循环范围改为range(1,5),同时调整数组索引:
def returnResult(): output = [] # K从1到4,对应取前1至前4个预测值 for K in range(1, 5): output.append(f"{prediction[K-1]} = {recall(actual, prediction, K)}") return output
3. 前端模板遍历列表
在predictIT.html中,可直接用Jinja2模板语法遍历传递过来的列表,示例如下:
{% for item in prediction_text %} <p>{{ item }}</p> {% endfor %}
完整修正后的代码片段
def predict_IT(): new_Xdata_IT = X_IT.sample(5) new_Ydata_IT = Cat_Y[new_Xdata_IT.index.values] pred_IT = model_IT.predict(new_Xdata_IT) def recall(new_Ydata_IT, pred_IT, K): act_set = set(new_Ydata_IT) pred_set = set(pred_IT[:K]) result = round(len(act_set & pred_set) / float(len(act_set)), 2) return result actual = new_Ydata_IT prediction = np.array(["Software Engineer / Programmer", "Technical Support Specialist", "Academician", "Administrative Assistant"]) np.random.shuffle(prediction) def returnResult(): output = [] # 修正循环范围与return语句缩进 for K in range(1, 5): output.append(f"{prediction[K-1]} = {recall(actual, prediction, K)}") return output return render_template("predictIT.html", prediction_text = returnResult())
内容的提问来源于stack exchange,提问作者AdmiralDugong
相关产品推荐
相关产品推荐

