Загрузка / вывод файлов Flask / Da sh CSV / Excel не уникален для каждого пользователя в разных случаях - PullRequest
1 голос
/ 06 апреля 2020

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

Я полагаю, это связано с глобальной переменной « queried_df », показанный ниже в моем фрагменте кода. Есть ли лучший способ поделиться / отправить данные из обратного вызова на сервер экспорта маршрутов?

Любые другие предложения приветствуются, спасибо!

@app.callback(
    Output('tables', 'children'),
    [Input("bom_1", "value"),
     Input("bom_2", "value"),
     Input("org_1", "value"),
     Input("org_2", "value"),
     Input("level", "value"),
     Input('button', 'n_clicks')]
)
def update_tables(bom_1, bom_2, org_1, org_2, level, n_clicks):

    global queried_df

    if n_clicks == 0:
        return dash.no_update

    queried_df = bc.compare(bom_1, org_1, bom_2, org_2, level)

    # perform other actions

    return table


@app.server.route('/export/')
def download_excel():
    strIO = io.BytesIO()
    writer = pd.ExcelWriter(strIO, engine="xlsxwriter")
    left = queried_df[0]
    left.to_excel(writer, sheet_name='Sheet1', startrow=1)

    excel_data = strIO.getvalue()
    strIO.seek(0)

    return send_file(strIO, attachment_filename='test.xlsx', as_attachment=True)

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Держать пользователей независимыми друг от друга - вот то, с чем может помочь flask сессия. Попробуйте:

from flask import session

и прочтите документацию здесь: https://flask.palletsprojects.com/en/1.1.x/quickstart/#sessions

0 голосов
/ 07 апреля 2020

Оказывается, send_file() отправит файл, хранящийся в кеше. указание cache_timeout=0 говорит ему удерживать в течение 0 секунд. Итак, решение будет таким:

return send_file(filename, as_attachment=True, cache_timeout=0)

Вот оригинальное решение:

Flask send_file отправляет старый файл вместо самого нового

...