Python 在两条路由之间传递数据帧和其他对象
我有一个flask webapp,我正试图使用它来查看/检索数据库中的一些数据(elasticsearch)。出于统计原因,数据是一个简单的随机样本。DB查询中的数据作为数据帧返回,并在一条路由中创建。我需要将此数据帧传递到第二个路由 由于随机性,如果我尝试在第二个路由中重新运行DB查询,它自然会返回不同的随机样本。出于本问题范围之外的原因,elasticsearch确实支持传入种子,但这会显著降低DB查询的速度(原则上我觉得这不需要两个单独的DB查询) 我有一个Python 在两条路由之间传递数据帧和其他对象,python,flask,Python,Flask,我有一个flask webapp,我正试图使用它来查看/检索数据库中的一些数据(elasticsearch)。出于统计原因,数据是一个简单的随机样本。DB查询中的数据作为数据帧返回,并在一条路由中创建。我需要将此数据帧传递到第二个路由 由于随机性,如果我尝试在第二个路由中重新运行DB查询,它自然会返回不同的随机样本。出于本问题范围之外的原因,elasticsearch确实支持传入种子,但这会显著降低DB查询的速度(原则上我觉得这不需要两个单独的DB查询) 我有一个查看\u数据路径,让用户查看数据
查看\u数据
路径,让用户查看数据,还有一个下载\u数据
路径,让用户以CSV、TSV或JSON的形式下载文件。我想让用户查看数据,如果数据是预期的,请单击URL下载他们正在查看的数据集
查看\u数据
如下所示:
@app.route('/view_data', methods=['GET'])
def view_data():
df = get_random_sample_from_database()
return render_template('view_data.html', dataframe = df)
用于查看数据的htmlview\u data.html
:
<html>
<body>
<!-- this shows data to user -->
<pre>
{% if not dataframe.empty %}
{{dataframe.__repr__()|safe}}
{% endif %}
</pre>
<!-- when user clicks this URL, it will download data rendered above, not sure how to pass in above dataframe -->
<a href="{{ url_for('download_data'}}">download above data</a>
<body>
</html>
以下是我调查过的几种不同方法:
“\u AppCtxGlobals”对象没有属性
类型错误李>
以下是我的尝试(2):
是否有一种简单的方法可以在
查看\u数据
中生成数据帧并将其传递给下载\u数据
?是否有更好的方法让用户通过下载数据选项查看数据?您是否向用户提供查看\u日期
路线中的所有数据?如果是,您可能只想在客户端进行处理,而不想再调用数据库。如果不是,请考虑给数据一个标识符,并将表保存在服务器上,并在一段时间后删除它。<代码> VIEWORDATE < /COD>包含DATAFRAM中的全部数据,但整个数据不以HTML形式呈现。你能详细说明你所说的客户端处理是什么意思吗?当您说将表保存到服务器时,是否有一种简单的轻量级方法可以做到这一点?只有在呈现了所有数据的情况下,客户端的处理才有意义,但事实并非如此。您可以做什么:1)用户请求数据2)生成表,将其存储在服务器端,并将表的一部分呈现给用户。给表一个id,并将id放在呈现表的表单中。当用户按下下载按钮时,使用此id从服务器检索保存的表?它似乎将数据存储在redis之类的东西中。我觉得这样做会奏效,但可能有些过分,因为这需要设置redis或其他服务器/DB
@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"})
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"})