Flask,使用表单输入作为全局变量,使用表单提交作为输入执行自定义ETL模块,然后在完成后显示图表

2024-05-14 09:12:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前让我的flask静态运行,我独立运行ETL作业,然后使用flask中的结果数据集显示chartjs折线图

但是,我希望将ETL部分集成到我的web框架中,我的用户可以登录并使用HTML表单提交输入参数(输入文件的位置和添加的版本id),然后我的ETL作业将使用HTML表单运行并使用结果数据直接在同一页面上显示图表

当前设置:

我的自定义ETL模块具有子模块,这些子模块共同作用形成一个简单的管道流程:

globals.py-有我的globals,比如s3和等的位置。理想情况下,我希望将用户的表单输入存储在这里,以便在必要时可以在我的所有子模块中直接使用它们

s3_bkt = 'abc'  #change bucket here
s3_loc = 's3://'+s3_bkt+'/'

ip_loc = 'alv-input/' 

#Ideally ,I'd like my users form inputs to be sitting here    

# ip1 = 'alv_ip.csv'
# ip2 = 'Input_product_ICL_60K_Seg15.xlsx'
#version = 'v1'

op_loc = 'alv-output/'

--main-module.py—主功能

import module3 as m3
import globals as g
def main(ip1,ip2,version):
    
    data3,ip1,ip2,version = m3.module3(ip1,ip2,version)
    ----perform some actions on the data and return---
    return res_data

--module3.py

import module2 as m2
def mod3(ip1,ip2,version):
    
    data2,ip1,ip2,version = m2.mod2(ip1,ip2,version)
    ----perform some actions on the data and return---
    return data3

--module2.py

import module1 as m1
import globals as g
def mod2(ip1,ip2,version):
    
    data1,ip1,ip2,version = m1.mod1(ip1,ip2,version)
    
    data_cnsts = pd.read_csv(ip2) #this is where i'll be using the user's input for ip2
 
    ----perform some actions on the datasets and write them to location with version_id to return---
    data1.to_csv(g.op_loc+'data2-'+ version + '.csv', index=False)
    return data2

--module1.py

 import globals as g
def mod1(ip1,ip2,version):
    
    #this is the location where the form input for the data location should be actually used

    data = pd.read_csv(g.s3_loc+g.ip_loc+ip1)
    ----perform some actions on the data and return---
    return data1

烧瓶设置:

import main-module as mm

app = Flask(__name__)

#this is where the user first hits and submits the form

@app.route('/form')
def form():
    return render_template('form.html')


@app.route('/result/',methods=['GET', 'POST'])
def upload():
    msg=''
    if request.method == 'GET':
        return f"The URL /data is accessed directly. Try going to '/upload' to submit form"
    
    if request.method == 'POST':
        ip1 = request.form['ip_file']
        ip2 = request.form['ip_sas_file']
        version = request.form['version']

        data = mm.main(ip1,ip2,version)
    
        grpby_vars = ['a','b','c']
    
        grouped_data = data.groupby(['mob'])[grpby_vars].mean().reset_index()


        #labels for the chart 
        a = [val for val in grouped_data['a']]

        #values for the chart 
        b = [round(val*100,3) for val in grouped_data['b']]
        c = [round(val*100,3) for val in grouped_data['c']]
        d = [val for val in grouped_data['d']]
    

        return render_template('results.html', title='Predictions',a=a,b=b,c=c,d=d)

烧瓶设置工作正常,无需使用用户的任何表单输入(如果ETL作业和烧瓶解耦,即当我运行ETL并直接向烧瓶提供结果数据位置时)

问题:

集成后的问题是,我不太确定如何将这些输入从用户传递到我的所有子模块

    data3,ip1,ip2,version = m3.module3(ip1,ip2,version)
TypeError: module3() missing 3 required positional arguments: 'ip1', 'ip2', and 'version'

所以,这肯定是由于我的param通过我的子模块的问题

因此,我的问题是如何将表单中的数据用作子模块中的全局变量。理想情况下,我希望它们存储在全局变量中,这样我就不必将它们作为参数传递给所有模块

有没有一个标准的方法来实现这一点?可能听起来很琐碎,但我正在努力达到我的最终状态

感谢您通读:)


Tags: 模块theimportformfordatareturns3
1条回答
网友
1楼 · 发布于 2024-05-14 09:12:00

我意识到我的愚蠢错误,我应该把它包括在内

data,ip1,ip2,version = mm.main(ip1,ip2,version)

我也可以使用globals文件,通过使用空字符串启动输入,然后将globals导入flask文件并更新值。这样我可以避免通过我的子模块传递参数

相关问题 更多 >

    热门问题