如何在一个函数内部使数据框全局化并在python flask的另一个函数中使用它

时间:2019-03-17 07:19:01

标签: python dataframe flask

我正在通过从网站上的用户获取输入文件并对其进行处理来创建数据框,然后我希望用户将最终结果下载到csv文件中。为此,上一个功能需要一个数据框。

我尝试传递数据框,但是由于在另一个函数中定义,它给了我错误。

我的代码是

from flask import Flask, render_template, request, redirect
from werkzeug import secure_filename
app = Flask(__name__)


@app.route('/uploader', methods = ['GET','POST'])
def upload():
 new=nrecs[['UserID','ProductID','Rating']]
 new['Recommendations'] = list(zip(new.ProductID, new.Rating))
 res=new[['UserID','Recommendations']]  
 res_new=res['Recommendations'].groupby([res.UserID]).apply(list).reset_index()
 pd.options.display.max_colwidth = 500
 return render_template('simple.html', tables=[res_new.to_html(classes='data')], titles='') 

@app.route('/download-csv', methods = ['GET'])
def download():
return res_new.to_csv('Recommendations.csv')

这只是我的代码的一个小片段,而不是完整的代码。

当用户单击下载建议按钮时,应下载csv文件。

还有其他解决方法吗?

2 个答案:

答案 0 :(得分:1)

您还可以将文件存储在服务器上,并通过download-csv路由将其发送给用户。这是send file tutorial

from flask import Flask, render_template, send_file
app = Flask(__name__)

@app.route('/uploader', methods = ['GET','POST'])
def upload():
    new=nrecs[['UserID','ProductID','Rating']]
    new['Recommendations'] = list(zip(new.ProductID, new.Rating))
    res=new[['UserID','Recommendations']]
    res_new=res['Recommendations'].groupby([res.UserID]).apply(list).reset_index()

    # store the dataframe on the server.
    res_new.to_csv('Recommendations.csv')

    pd.options.display.max_colwidth = 500
    return render_template('simple.html', tables=[res_new.to_html(classes='data')], titles='')

@app.route('/download-csv', methods = ['GET'])
def download():

    # return the CSV file to the user here.
    return send_file('Recommendations.csv')

答案 1 :(得分:0)

您可以尝试使用会话对象。参见this question/answer。但是,根据数据框的大小以及最终要执行的操作,这可能不是执行此操作的最佳方法。如果您要设置上传/下载路径,请将文件存储在服务器/其他地方,然后在用户要求时将其发送给用户可能是一个更好的解决方案。

from flask import Flask, render_template, session
app = Flask(__name__)
# secret key is needed for session
app.secret_key = 'your secret key'

@app.route('/uploader', methods = ['GET','POST'])
def upload():
    new=nrecs[['UserID','ProductID','Rating']]
    new['Recommendations'] = list(zip(new.ProductID, new.Rating))
    res=new[['UserID','Recommendations']]
    res_new=res['Recommendations'].groupby([res.UserID]).apply(list).reset_index()

    session['reco_df'] = res_new

    pd.options.display.max_colwidth = 500
    return render_template('simple.html', tables=[res_new.to_html(classes='data')], titles='')

@app.route('/download-csv', methods = ['GET'])
def download():
    return session['reco_df'].to_csv('Recommendations.csv')