You need to enable JavaScript to run this app. 如何在Flask Web框架中加载多个Pickle模型并在Web API中输出预测结果
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask Web框架中加载多个Pickle模型并在Web API中输出预测结果

Flask多Pickle模型加载Web应用实现

核心改造逻辑

替换原有单模型全局加载的实现,采用注册表字典结构统一管理所有已加载的Pickle模型,应用启动时批量扫描加载指定目录的模型文件,Web端新增模型选择交互入口,预测阶段根据用户选中的模型完成推理并返回结果。

具体调整点

  • 用字典结构存储所有模型实例,替代原单个全局model变量,实现多模型的快速索引调用
  • 新增批量加载函数,应用启动时自动扫描指定模型目录下的所有.pkl文件,无需手动逐行编写加载代码
  • 适配表单结构变化:过滤非数值类型的表单输入,避免把模型选择字段的字符串值误判为预测特征,触发类型转换错误
  • 新增模型合法性校验逻辑,避免用户传入无效模型名称时触发程序崩溃

改造后的完整可运行代码

import os
import numpy as np
from flask import Flask, request, render_template
import pickle

app = Flask(__name__)
# 模型注册表:键为模型名称,值为加载完成的模型实例
MODEL_REGISTRY = {}
# 配置存放Pickle模型的目录路径
MODEL_DIR = "./models"

def load_all_models():
    """应用启动时批量加载目录下所有Pickle模型"""
    for file_name in os.listdir(MODEL_DIR):
        if file_name.endswith(".pkl"):
            model_path = os.path.join(MODEL_DIR, file_name)
            # 去掉文件后缀作为模型的唯一标识
            model_key = os.path.splitext(file_name)[0]
            with open(model_path, "rb") as f:
                MODEL_REGISTRY[model_key] = pickle.load(f)
    print(f"加载完成,当前可用模型列表:{list(MODEL_REGISTRY.keys())}")

# 应用启动前完成所有模型加载
load_all_models()

@app.route('/')
def home():
    # 将可用模型列表传递给前端,供下拉选择使用
    return render_template('index.html', model_list=list(MODEL_REGISTRY.keys()))

@app.route('/predict', methods=['POST'])
def predict():
    # 获取用户选中的模型名称
    selected_model = request.form.get("selected_model")
    # 校验所选模型是否存在
    if selected_model not in MODEL_REGISTRY:
        return render_template('index.html', prediction_text="所选模型不存在,请刷新重试")
    
    # 提取数值型输入作为预测特征,过滤非数值的模型选择字段
    int_features = [int(x) for x in request.form.values() if x.isdigit()]
    final_features = [np.array(int_features)]
    # 从注册表取出对应模型完成预测
    model = MODEL_REGISTRY[selected_model]
    prediction = model.predict(final_features)
    output = round(prediction[0], 2)

    return render_template(
        'index.html',
        prediction_text=f'模型[{selected_model}]的水量预测结果为{output}升'
    )

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

前端页面配套调整

在原有index.html的预测表单区域新增模型选择模块,核心代码片段:

<div>
    <label>选择预测模型:</label>
    <select name="selected_model" required>
        {% for model in model_list %}
        <option value="{{ model }}">{{ model }}</option>
        {% endfor %}
    </select>
</div>

部署注意事项

  • 在项目根目录新建models文件夹,将所有待部署的Pickle模型统一放入该目录,应用启动时会自动遍历加载
  • 原单模型实现存在缩进缺失问题(predict函数内部逻辑、app.run代码未缩进),直接运行会触发语法错误,改造版本已同步修正
  • 模型加载完成后可查看控制台输出的可用模型列表,确认所有模型是否加载成功

内容的提问来源于stack exchange,提问作者Shridatha Hegde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 00:54:07