如何将响应类与在Flask上其他路由上创建的参数一起使用?

2024-06-16 10:26:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将数据帧导出到CSV中。为此,我有一个名为create_simulation()的函数,它给了我一个新的模拟,我在我的索引路由@app.route("/")上调用它,这样我就可以将模拟显示到一个数据帧及其CSV中。你知道吗

还有一个提供生成的模拟的下载文件的路由(@app.route('/download'))。但是我检索下载文件的唯一方法是在这个路径上再次使用create_simulation,它给了我一个与在索引上绘制的文件不同的值。你知道吗

如何使用在@app.route("/")上创建的变量提供一个可下载的文件,其结果与索引@app.route('/download')上显示的结果相同?你知道吗

你知道吗视图.py地址:

from flask import render_template, send_file, send_from_directory, safe_join, abort, make_response, Response
from flask import send_file
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import random
import seaborn as sns
import sys

@app.route("/jinja")
def jinja():

    my_name = "Testes"

    return render_template("/public/jinja.html", my_name=my_name)

@app.route("/about")
def about():
    return render_template("/public/about.html")

#defining parameters
bast_param = [0,5] #ba prefix for below average student
avst_param = [5,7] #av prefix for average student
aast_param = [7,10] #aa prefix for above average student

min_bast = bast_param[0]
max_bast = bast_param[1]
min_avst = avst_param[0]
max_avst = avst_param[1]
min_aast = aast_param[0]
max_aast = aast_param[1]


#RELEVANT FOR STACK OVERFLOW QUESTION
@app.route("/")
def index():
    simulation = create_simulation()
    return render_template('/public/index.html',table=simulation.to_html(),download_csv=simulation.to_csv(index=True, sep=";"))


#RELEVANT FOR STACK OVERFLOW QUESTION
@app.route('/download')
def download():
    # stream the response as the data is generated
    simulation = create_simulation()
    response = Response(
        simulation.to_csv(),
        mimetype="text/csv",
        headers={"Content-disposition":
                 "attachment; filename=grades_simulation.csv"})
    # add a filename

    return response


@app.route("/parameters")
def parameters():

    return render_template('/public/parameters.html', min_bast=min_bast, max_bast=max_bast, min_avst=min_avst,max_avst=max_avst, min_aast=min_aast, max_aast=max_aast)



#RELEVANT FOR STACK OVERFLOW QUESTION
def create_simulation():

    #students quantities per parameter
    bast_qtd = 5
    avst_qtd = 3
    aast_qtd = 8
    st_total = bast_qtd + avst_qtd + aast_qtd

    #Defining Subjects
    subjects = ["Disciplina 1", "Disciplina 2", "Disciplina 3", "Disciplina 4", "Disciplina 5"]

    students = []

    #counter for students ids creation
    i = 0

    #counters and variable for grades creation
    a = 0
    b = 0
    newgradeline = []

    grade = []

    #creating students and grades
    while(i < st_total):
        newstudent = random.randint(100000,199999)
        #excluding duplicates
        if newstudent not in students:
            students.append(newstudent)
            i = i+1


    # In[3]:


    #below averagge students
    while (a < bast_qtd):
        b = 0
        newgradeline = []
        grade.append(newgradeline)
        while (b<len(subjects)):
            gen_grade = round(random.uniform(bast_param[0],bast_param[1]),2)
            newgradeline.append(gen_grade)
            b = b+1
        a = a +1
    a = 0

    #average students
    while (a < avst_qtd):
        b = 0
        newgradeline = []
        grade.append(newgradeline)
        while (b<len(subjects)):
            gen_grade = round(random.uniform(avst_param[0],avst_param[1]),2)
            newgradeline.append(gen_grade)
            b = b+1
        a = a +1
    a = 0

    #above average students
    while (a < aast_qtd):
        b = 0
        newgradeline = []
        grade.append(newgradeline)
        while (b<len(subjects)):
            gen_grade = round(random.uniform(aast_param[0],aast_param[1]),2)
            newgradeline.append(gen_grade)
            b = b+1
        a = a +1


    # In[4]:
    #generating table
    simulation = pd.DataFrame (grade,index=students, columns=subjects)
    return simulation

你知道吗索引.html地址:

{% extends "/public/templates/public_template.html" %}

{% block  title %}Simulador{% endblock%}

{% block main %}
  <div class="container">
    <div class="row">
      <div class="col">
      </br>
        <h1>Simulador</h1>
      <hr/>
        {{table| safe}}
        <br />
      <a class="btn btn-primary" href="/" role="button">New simulation</a>
      <a class="btn btn-primary" href="/parameters" role="button">Edit Parameters</a>
      </div>
    </div>
    <div class="row">
      <div class="col">
      </br>
      <hr/>
        <h1>CSV File</h1>
        {{download_csv | safe}}
      </br></br>
        <a class="btn btn-primary" href="/download" role="button">Download CSV</a>
        <hr/>
    </div>
    </div>
  </div>

{% endblock %}

Tags: importdivappparamminroutemaxsimulation
1条回答
网友
1楼 · 发布于 2024-06-16 10:26:21

我想你有三个选择:

1)将结果存储在数据库中,并向“索引视图”页提供某种唯一的id,以便当您单击“下载”按钮时,它会查找相关数据并生成CSV文件。这是一个很好的解决方案,但是需要一个数据库后端,如果您以前从未使用过,那么设置起来可能会很复杂。你知道吗

2)来回传递数据。您可以使用df.to_json()传递存储在视图中的JSON数据,当单击按钮时,它会提交一个POST请求,其中包含必要的JSON数据,您可以从中重建数据帧。您可以使用隐藏的表单字段来存储数据。 例如

<form action="/download" method="POST">
    <input type="hidden" id="df" name="df" value="{{ df_json }}">
    <submit>Download</submit>
</form>

@route('/download', methods=["POST"])
def download():
    data = request.form['df']
    df = pd.from_json(data)

3)将结果存储在session。这样做可以将数据从一个视图传递到另一个视图,但这更难控制,并且需要在视图未同步执行时进行错误捕获。在这种情况下,它可能会工作,但我不建议它作为一个生产解决方案。你知道吗

相关问题 更多 >