首页 > 解决方案 > 将下拉选择传递给 Flask/Python 函数

问题描述

我有一个工作 Flask 应用程序(下面的相关部分),它读取 .csv 文件并将数据帧的头部打印到屏幕上。此外,它会将消息中列的平均值硬编码到屏幕上。

from flask import Flask, render_template, request 
import numpy as np
from scipy.stats import binom  
from scipy.optimize import minimize
from scipy.stats import norm 
from scipy import optimize 
from pyodbc import connect 
import pandas as pd 

app = Flask(__name__)


@app.route('/dataTools', methods=['GET', 'POST'])
def data_tools_upload():
    if request.method == 'POST':
        orig_df = pd.read_csv(request.files.get('file'))
        vars = list(orig_df.columns)
        mean = orig_df[vars[4]].mean()
        dims = orig_df.shape
        message = 'You have data! There are %s rows and %s columns and the variable %s has mean %s' % (dims[0],dims[1],vars[4],round(mean,3))
        table = orig_df.head(10).to_html(classes='data', header = "true")
        return render_template('upload.html', tables = [table], message = message, vars = vars)
    return render_template('upload.html')    


if __name__ == '__main__':
    app.run(debug=True)
    # or just app.run()

在我的 HTML 中是以下部分

<form method=post enctype=multipart/form-data>
    <input type=file name=file class = "btn btn-outline-secondary">
    <input type=submit value=Upload class = "btn btn-outline-secondary">
</form>

<select name= vars method="GET" action="/">
    {% for vars in vars %}
    <option value= "{{vars}}" SELECTED>{{vars}}</option>"
    {% endfor %}
</select>
</select>

这一切都“有效”,因为它显示了我希望的内容。但是,我特别致力于的是下拉菜单当前自动填充数据框中列的名称。我想要的是用户在该下拉菜单中选择一个选项,然后它将传递给该部分mean = orig_df[vars[4]].mean(),以便打印他们选择的变量的平均值。

感谢您的任何建议。

更新

我意识到如果我想将信息从 HTML 发送回服务器,我需要进行一些更改。我正在尝试以下

@app.route('/dataTools', methods=['GET', 'POST'])
def data_tools_upload():
    if request.method == 'POST':
        orig_df = pd.read_csv(request.files.get('file'))
        vars = list(orig_df.columns)
        #mean = orig_df[vars[4]].mean()
        var2use = request.option.get("vars")
        mean = orig_df[var2use].mean()
        dims = orig_df.shape
        message = 'You have data! There are %s rows and %s columns and the variable %s has mean %s' % (dims[0],dims[1],vars[4],round(mean,3))
        table = orig_df.head(10).to_html(classes='data', header = "true")
        return render_template('upload.html', tables = [table], message = message, vars = vars)
    return render_template('upload.html') 

我在其中添加了该部分var2use = request.option.get("vars"),然后在 HTML 中进行了以下更新,因此还有一个 POST 方法,并且该操作返回到烧瓶应用程序中的函数。

<select name= vars method="GET|POST" action="{{url_for('data_tools_upload')}}">
    {% for var in vars %}
    <option value= "{{var}}" SELECTED>{{var}}</option>"
    {% endfor %}
</select>
</select>

我收到以下错误AttributeError: 'Request' object has no attribute 'option'

希望此更新有所帮助,也希望提供建议的解决方案。

标签: pythonflask

解决方案


推荐阅读