Как сделать глобальный dataframe внутри функции и использовать его в другой функции в фляге Python - PullRequest
0 голосов
/ 17 марта 2019

Я создаю Dataframe, принимая входной файл от пользователя на веб-сайте и обрабатывая его. После этого я хочу, чтобы пользователь загрузил конечный результат в файл csv. Для этого требуется Dataframe из предыдущей функции.

Я попытался передать фрейм данных, но он выдает ошибку, как это определено в другой функции.

Мой код

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 ]

1 голос
/ 20 марта 2019

Вы также можете сохранить файл на сервере и отправить его пользователю по маршруту download-csv.Вот учебник по отправке файлов

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')
0 голосов
/ 17 марта 2019

Вы можете попробовать использовать объект сеанса.См. этот вопрос / ответ .Однако, в зависимости от размера фрейма данных и того, что вы в конечном итоге пытаетесь сделать, это может быть не лучшим способом сделать это.Если вы пытаетесь настроить маршруты выгрузки / загрузки, лучшим решением может быть сохранение файла на сервере или в другом месте, а затем отправка его пользователю, когда он запросит его.

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...