Передать выпадающий выбор в Flask / Python Function - PullRequest
0 голосов
/ 06 мая 2020

У меня есть работающее приложение 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, и действие возвращается к функции в приложение flask.

<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'.

Надеюсь, что это обновление поможет, а также надеюсь на предлагаемое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...