Flask预测应用遇端点覆盖及路径报错,请求解决方案
问题解决:Flask应用中的端点覆盖与模型/模板加载问题
1. 解决View function mapping is overwriting an existing endpoint function: app_calculation错误
这个错误的核心原因是同一个视图函数被重复绑定到了同一个路由,常见触发场景:
- 代码在交互式环境中被重复执行(比如多次运行代码块)
- 函数定义或路由装饰器被多次调用
修复方案:
- 确保整个Flask应用代码只执行一次,避免重复运行包含
@app.route和def app_calculation()的代码块 - 重启应用进程,清除重复注册的路由绑定
2. 解决模型加载与模板路径报错问题
2.1 优化模型加载逻辑
你的set_params函数每次调用都会重新加载模型,这不仅效率极低,还可能因重复加载引发资源冲突或路径解析错误。应将模型加载放到函数外部,仅初始化一次:
# 全局加载模型(仅执行一次) model = keras.models.load_model("D:/Авито/App/k_m/") def set_params(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12): # 模型输入需为二维数组,修正原写法的维度问题 input_data = np.array([[param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12]]) prediction = model.predict(input_data) return prediction[0][0]
2.2 修复模板路径问题
Flask默认从应用根目录下的templates文件夹加载模板,使用绝对路径易出现权限或路径解析问题。推荐两种处理方式:
- 将
index.html移动到应用根目录下的templates文件夹(如D:/Авито/App/templates/),修改render_template调用为相对路径:
return render_template("index.html", message=message)
- 若必须使用自定义绝对路径,直接配置Flask的模板目录:
app = Flask(__name__, template_folder="D:/Авито/App/Прогнозы")
完整修复后的代码示例
import numpy as np import tensorflow as tf from tensorflow import keras from flask import Flask, request, render_template # 初始化Flask应用并配置模板目录 app = Flask(__name__, template_folder="D:/Авито/App/Прогнозы") # 全局加载模型(仅执行一次) model = keras.models.load_model("D:/Авито/App/k_m/") def set_params(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12): input_data = np.array([[param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12]]) prediction = model.predict(input_data) return prediction[0][0] @app.route('/', methods=['POST', 'GET']) def app_calculation(): param_lst = [] message = '' if request.method == 'POST': # 读取表单参数并转换为数值类型,增加空值判断 for i in range(1, 13): param = request.form.get(f'param{i}') if param is not None: param_lst.append(float(param)) if len(param_lst) == 12: message = set_params(*param_lst) else: message = "参数输入不完整,请检查所有字段" return render_template("index.html", message=message) if __name__ == '__main__': app.run(debug=True)
额外注意事项
- 确保模型路径下包含完整的Keras模型文件(如
.h5文件或SavedModel格式文件夹) - 表单提交的参数需为可转换为
float的数值,避免类型转换错误 - 开启
debug=True可在开发时查看详细错误信息,便于排查问题
内容的提问来源于stack exchange,提问作者Black Jacl
相关产品推荐
相关产品推荐

