Flask接收用户输入动态计算时间序列循环数的实现问题
如何实现Flask动态接收用户输入的阈值来统计时间序列循环数?
我是Flask和HTML新手,现在开发一个统计时间序列曲线循环数的小应用:当曲线段的下限值<13且峰值>20时,统计波动次数。目前已经实现静态数据统计,但希望支持用户通过UI输入自定义阈值(如下限<4、上限>15)来动态计算,现有代码存在问题,求修正方案。
原代码存在的问题
- 路由函数
get_count参数错误,且内部变量未定义(如x1) - 用户输入的两个阈值被重复赋值给同一个变量,未正确区分
- 静态阈值硬编码在判断条件中,未替换为用户输入值
- 函数内存在多个无效
return语句,逻辑混乱 - 启动时直接调用
get_count(x)缺少必要参数,会报错
修正后的Flask代码
import numpy as np from flask import Flask, render_template, request app = Flask(__name__) # 全局时间序列数据 x = np.array([0, 7, 18, 24, 26, 27, 26, 25, 26, 16, 20, 16, 23, 33, 27, 27, 22, 26, 27, 26, 25, 24, 25, 26, 23, 25, 26, 24, 23, 12, 22, 11, 15, 24, 11, 12, 11, 27, 19, 25, 26, 21, 23, 26, 13, 9, 22, 18, 23, 26, 26, 25, 10, 22, 27, 25, 19, 10, 15, 20, 21, 13, 16, 16, 15, 19, 17, 20, 24, 26, 20, 23, 23, 25, 19, 15, 16, 27, 26, 27, 28, 24, 23, 24, 27, 28, 30, 31, 30, 9, 0, 11, 16, 25, 25, 22, 25, 25, 11, 15, 24, 24, 24, 17, 0, 23, 21, 0, 24, 26, 24, 26, 26, 26, 24, 25, 24, 24, 22, 22, 22, 23, 24, 26,23]) def calculate_cycles(data, lower_threshold, upper_threshold): """工具函数:根据阈值统计循环数""" # 按下降点分割序列(保留原逻辑) split_points = np.where(np.diff(data) < 0)[0] + 1 sub_lists = np.split(data, split_points) cycle_count = 0 for segment in sub_lists: # 使用用户输入的阈值判断 if (min(segment) <= lower_threshold and max(segment) > upper_threshold and len(set(segment)) > 1): cycle_count += 1 return cycle_count @app.route('/', methods=['GET', 'POST']) def index(): count_result = None lower = 13 # 默认下限阈值 upper = 20 # 默认上限阈值 if request.method == 'POST': # 获取用户输入并转换为整数 try: lower = int(request.form['Input1']) upper = int(request.form['Input2']) except ValueError: # 处理输入非数字的情况 count_result = "请输入有效的数字阈值" return render_template('index.html', count_result=count_result, lower=lower, upper=upper) # 计算循环数 count_result = calculate_cycles(x, lower, upper) # GET请求或首次加载时,使用默认阈值计算 if count_result is None: count_result = calculate_cycles(x, lower, upper) return render_template('index.html', count_result=count_result, lower=lower, upper=upper) if __name__ == "__main__": app.run(debug=False, port=1223)
代码说明
- 新增
calculate_cycles工具函数,专门处理统计逻辑,接收数据和两个阈值参数,返回结果 - 主路由
/同时支持GET和POST请求,无需额外的/send路由 - 处理用户输入时增加异常捕获,避免非数字输入导致崩溃
- 默认使用原静态阈值(13和20),用户提交后替换为自定义值
- 移除无效的递归调用和多余return语句,逻辑清晰
优化后的HTML页面代码
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>循环数统计计算器</title> </head> <body> <h1>时间序列循环数统计</h1> <form method="POST"> <label>下限阈值(曲线段最小值需≤此值):</label> <input type="number" name="Input1" id="Input1" value="{{ lower }}"> <br><br> <label>上限阈值(曲线段最大值需>此值):</label> <input type="number" name="Input2" id="Input2" value="{{ upper }}"> <br><br> <input type="submit" value="计算循环数"/> <br /> <br /> <p>当前阈值下的循环数:{{ count_result }}</p> </form> </body> </html>
HTML优化点
- 给输入框添加清晰的标签,用户明确知道输入的是哪个阈值
- 使用
type="number"代替text,限制用户只能输入数字,减少错误 - 回显当前使用的阈值(默认或用户输入值),提升用户体验
- 优化提示文本,更直观地展示结果
内容的提问来源于stack exchange,提问作者user20289810
相关产品推荐
相关产品推荐

