У меня есть веб-приложение для колб, которое я пытаюсь использовать для просмотра / извлечения некоторых данных из базы данных (asticsearch).По статистическим причинам данные представляют собой простую случайную выборку.Данные из запроса к БД возвращаются в виде кадра данных pandas и создаются по одному маршруту.Мне нужно передать этот dataframe во второй маршрут.
Из-за случайности, если я попытаюсь повторно выполнить запрос БД на втором маршруте, он, естественно, вернет другую случайную выборку.По причинам, выходящим за рамки этого вопроса ,asticsearch поддерживает передачу начальных значений, но они значительно замедляют запрос к БД (и в принципе я считаю, что для этого не требуется 2 отдельных запроса к БД).
У меня естьмаршрут view_data
, который позволяет пользователям просматривать данные, и второй маршрут download_data
, который позволяет пользователю загружать файл в формате CSV, TSV или JSON.Я хочу позволить пользователям просматривать данные, и если данные соответствуют ожидаемым, нажмите на URL, чтобы загрузить набор данных, который они просматривают.
view_data
выглядит примерно так:
@app.route('/view_data', methods=['GET'])
def view_data():
df = get_random_sample_from_database()
return render_template('view_data.html', dataframe = df)
HTML для просмотра данных view_data.html
:
<code><html>
<body>
<!-- this shows data to user -->
<pre>
{% if not dataframe.empty %}
{{dataframe.__repr__()|safe}}
{% endif %}
загрузить вышеуказанные данные Функция для download_data
:
@app.route('/download_data', methods=['GET'])
def download_data():
# Use some magic here to get the df created in view_data
return Response(
df.to_csv(),
mimetype="text/csv",
headers={"Content-disposition":"attachment; filename=data.csv"})
Вот несколько различных методов, которые я исследовал:
- сеансов во фляге: похоже, данные в браузере пользователя хранятся в виде безопасного cookie.Я не хочу идти по этому пути, потому что случайная выборка может быть где-то от 1 МБ до 100 + МБ.
- flask.g: Я пробовал это, но не могу понять, как это сделать правильно, так как япродолжайте получать
'_AppCtxGlobals' object has no attribute
ошибки типа.
Вот что я попытался сделать (2):
from flask import g
@app.route('/view_data', methods=['GET'])
def view_data():
df = get_random_sample_from_database()
g.data = df
return render_template('view_data.html', dataframe = df)
@app.route('/download_data', methods=['GET'])
def download_data():
df = g.data
return Response(
df.to_csv(),
mimetype="text/csv",
headers={"Content-disposition":"attachment; filename=data.csv"})
Есть ли простой способ создать кадр данных в view_data
и передать его в download_data
?Есть ли лучший способ позволить пользователю просматривать данные с возможностью загрузки данных?