Web2py:如何通过表单输入运行Notebook并展示可视化结果?
Web2py表单传值+图表展示解决方案
1. 接收表单提交数据
在你的default.py控制器里,直接通过表单对象提取用户提交的输入值:
def index(): # 替换成你的SQLForm实例化代码 form = SQLForm(db.your_table) if form.accepts(request.vars, session): # 从form.vars中获取字段值,字段名需和表单定义一致 first_name = form.vars.first_name last_name = form.vars.last_name stadium = form.vars.stadium # 调用图表生成函数,拿到图片文件名 chart_file = make_spraychart(first_name, last_name, stadium) # 将数据传递给视图 return dict(form=form, chart_file=chart_file) # 表单未提交或验证失败时,返回表单 return dict(form=form)
2. 封装图表生成逻辑
把pybaseball生成图表的代码封装成独立函数,注意将图片保存到Web2py的static目录(只有该目录下的文件能被前端访问):
import matplotlib.pyplot as plt from pybaseball import spraychart # 强制matplotlib使用无GUI后端,适配PythonAnywhere环境 plt.switch_backend('Agg') def make_spraychart(first_name, last_name, stadium): try: # 生成spraychart,替换为你的实际数据处理逻辑 fig, ax = plt.subplots(figsize=(10,8)) spraychart(first_name, last_name, park=stadium, ax=ax) # 生成唯一文件名避免冲突 filename = f"spray_{first_name.lower()}_{last_name.lower()}_{stadium.lower()}.png" save_path = f"{request.folder}/static/{filename}" plt.savefig(save_path, bbox_inches='tight') plt.close(fig) # 关闭画布释放内存 return filename except Exception as e: # 捕获错误并返回信息 return str(e)
注意:PythonAnywhere上需提前安装依赖,执行pip install pybaseball matplotlib即可。
3. 在视图中展示图表
打开views/default/index.html,添加图表展示逻辑:
{{extend 'layout.html'}} <!-- 渲染表单 --> {{=form}} <!-- 展示生成的图表或错误信息 --> {{if chart_file:}} <div class="chart-container"> <h3>Spray Chart Result:</h3> <img src="{{=URL('static', chart_file)}}" alt="Player Spray Chart"> </div> {{elif chart_file is not None:}} <p style="color:red;">生成失败: {{=chart_file}}</p> {{endif}}
关键注意事项
- 静态文件清理:用户多次提交会导致static目录积累大量图片,可在生成新图表前删除旧同名文件,或定期清理。
- 表单验证:给SQLForm字段添加必填规则,比如
db.your_table.first_name.requires = IS_NOT_EMPTY(),避免空值传入脚本。 - 权限检查:确保PythonAnywhere上Web2py的static目录有写入权限,默认情况下权限是足够的,若保存失败可排查目录权限。
内容的提问来源于stack exchange,提问作者Zthan
相关产品推荐
相关产品推荐

