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

如何从HTML前端向Flask后端传递二维数组并解决类型错误

问题:Flask后端接收前端二维特征数组时出现哈希不可用错误

问题背景

在Google Colab中运行的预测代码完全正常,但通过HTML前端输入特征数组到Flask后端时,抛出TypeError: unhashable type: 'numpy.ndarray'错误。

Colab中正常运行的代码

import numpy as np

# 示例输入数据
input_data = [[3758096389, 0, 114456999, 0, 0, 0, 2601295.432, 10001143, 2601295.432, 10001143, 1, 0, 0.393160754, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0]]

import joblib

# 转换为numpy数组
input_array = np.array(input_data)

ensemble_model=joblib.load('/content/ensemble_model_3_DT_RF.pkl')

# 生成预测结果
ensemble_predictions = ensemble_model.predict(input_array)

# 打印预测标签
print("Predicted Labels:", ensemble_predictions)

当前Flask后端代码(存在问题版本)

def predictFunction():
    data = request.form['feature_array'] # 获取前端传来的字符串格式特征数组
    
    # 将字符串转换为二维列表
    data = np.array(eval(data))
    data = data.tolist()
    selected_model = request.form['model']
    
    if selected_model == 'Ensemble Model 1':
        # 使用集成模型1预测
        prediction = Ensemble_model_1.predict(data)
    elif selected_model == 'Ensemble Model 2':
        # 使用集成模型2预测
        prediction = Ensemble_model_2.predict(data)
    elif selected_model == 'Ensemble Model 3':
        # 使用集成模型3预测
        prediction = Ensemble_model_3.predict(data)
    else:
        prediction =  selected_model       

当前HTML表单代码

<form method="POST" action="/predictFunction">
  <div class="mb-3">
    <label for="feature_array">Feature Array:</label>
    <input type="text" id="feature_array" class="form-control" name="feature_array" placeholder="Enter the feature array" value="">
  </div>
  <button class="btn btn-dark">Predict</button>
</form>

解决方案

错误核心原因:eval()解析存在安全风险且数据格式易出错,同时模型predict()要求输入为二维numpy数组,当前处理流程未严格匹配该格式。

修正步骤

1. 优化前端输入体验(可选)

将单行输入框改为多行文本框,同时增加模型选择下拉框,减少用户输入错误:

<form method="POST" action="/predictFunction">
  <div class="mb-3">
    <label for="feature_array">特征数组(每行一个样本,元素用逗号分隔):</label>
    <textarea id="feature_array" class="form-control" name="feature_array" rows="3" placeholder="例如:3758096389,0,114456999,..."></textarea>
  </div>
  <div class="mb-3">
    <label for="model">选择模型:</label>
    <select id="model" name="model" class="form-control">
      <option value="Ensemble Model 1">集成模型1</option>
      <option value="Ensemble Model 2">集成模型2</option>
      <option value="Ensemble Model 3">集成模型3</option>
    </select>
  </div>
  <button class="btn btn-dark">预测</button>
</form>

2. 修正Flask后端代码

import ast
import numpy as np
from flask import request, jsonify

def predictFunction():
    try:
        # 获取前端提交的数据
        feature_str = request.form.get('feature_array', '')
        selected_model = request.form.get('model', '')

        # 支持两种输入格式解析
        if feature_str.startswith('['):
            # 直接解析二维数组字符串(如"[[1,2],[3,4]]")
            data_list = ast.literal_eval(feature_str)
        else:
            # 按行分割解析(每行一个样本,元素用逗号分隔)
            data_list = []
            for row in feature_str.split('\n'):
                row = row.strip()
                if row:
                    elements = [float(x.strip()) for x in row.split(',')]
                    data_list.append(elements)
        
        # 转换为模型要求的二维numpy数组
        input_array = np.array(data_list)

        # 校验输入维度
        if input_array.ndim != 2:
            return jsonify({'error': '输入必须是二维数组'}), 400

        # 执行预测
        prediction = None
        if selected_model == 'Ensemble Model 1':
            prediction = Ensemble_model_1.predict(input_array)
        elif selected_model == 'Ensemble Model 2':
            prediction = Ensemble_model_2.predict(input_array)
        elif selected_model == 'Ensemble Model 3':
            prediction = Ensemble_model_3.predict(input_array)
        else:
            return jsonify({'error': '无效的模型选择'}), 400

        # 返回可序列化的预测结果
        return jsonify({'predicted_labels': prediction.tolist()})
    
    except Exception as e:
        return jsonify({'error': f'处理失败:{str(e)}'}), 500

关键优化点

  • 用ast.literal_eval()替代eval():避免执行恶意代码,提升安全性
  • 严格匹配模型输入格式:确保最终输入为二维numpy数组,与Colab中测试格式完全一致
  • 增加错误处理:捕获解析、维度等异常,返回明确的错误信息
  • 兼容多种输入格式:既支持直接输入二维数组字符串,也支持按行输入样本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:55:05