Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在两条路由之间传递数据帧和其他对象_Python_Flask - Fatal编程技术网

Python 在两条路由之间传递数据帧和其他对象

Python 在两条路由之间传递数据帧和其他对象,python,flask,Python,Flask,我有一个flask webapp,我正试图使用它来查看/检索数据库中的一些数据(elasticsearch)。出于统计原因,数据是一个简单的随机样本。DB查询中的数据作为数据帧返回,并在一条路由中创建。我需要将此数据帧传递到第二个路由 由于随机性,如果我尝试在第二个路由中重新运行DB查询,它自然会返回不同的随机样本。出于本问题范围之外的原因,elasticsearch确实支持传入种子,但这会显著降低DB查询的速度(原则上我觉得这不需要两个单独的DB查询) 我有一个查看\u数据路径,让用户查看数据

我有一个flask webapp,我正试图使用它来查看/检索数据库中的一些数据(elasticsearch)。出于统计原因,数据是一个简单的随机样本。DB查询中的数据作为数据帧返回,并在一条路由中创建。我需要将此数据帧传递到第二个路由

由于随机性,如果我尝试在第二个路由中重新运行DB查询,它自然会返回不同的随机样本。出于本问题范围之外的原因,elasticsearch确实支持传入种子,但这会显著降低DB查询的速度(原则上我觉得这不需要两个单独的DB查询)

我有一个
查看\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)
用于查看数据的html
view\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>
以下是我调查过的几种不同方法:

  • flask会话:这似乎将数据作为安全cookie存储在用户的浏览器上。我不想走这条路,因为随机样本可能在1MB到100+MB之间
  • flask.g:我已经尝试过这个方法,但无法找到正确的方法,因为我一直得到
    “\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"})