【问题标题】:Python - flask - jinja2 - Dynamically generating routes and functions by looping through valuesPython - flask - jinja2 - 通过循环值动态生成路由和函数
【发布时间】:2018-12-17 08:44:22
【问题描述】:

您好,我对烧瓶和 python 还很陌生

我正在尝试创建一个简单的 Web 应用程序,其中列出了多个商店编号,并单击超链接下载 csv 文件(我从 SQL 服务器获取此数据 - 将其放入数据框并使用 to_csv 进行转换动态到 csv)

我的问题是——如何动态生成路由@app.route("/getCSV/" and def getCSV..)?

任何帮助将不胜感激。

以下案例仅包含 2 家商店,以后可能会增加到 5 或 100 家..

我已经粘贴了下面的代码,我在 html 中使用 Jinja 模板

app.py

from flask import Flask, render_template, redirect, request, Response
from datetime import datetime
import pandas as pd
import pyodbc


#Define app
app = Flask(__name__)

#Db connection
ikbconn = pyodbc.connect('Driver={SQL Server};Server=xxxxx;Database=xx;uid=sa;pwd=xxxxx')

storelist = ['11','72']


@app.route("/")
def hello():
    return render_template('template.html',my_storelist = storelist)


@app.route("/getCSV/11")
def getCSV11():
        selectquery = "EXEC temp_POGListSP" + " " + "11"
        data = pd.read_sql(selectquery, ikbconn)
        csv11 = data.to_csv()
        return Response(
            csv11,mimetype="text/csv",headers={"Content-disposition":"attachment; filename=POGList_11.csv"})

@app.route("/getCSV/72")
def getCSV72():
        selectquery = "EXEC temp_POGListSP" + " " + "72"
        data = pd.read_sql(selectquery, ikbconn)
        csv72 = data.to_csv()
        return Response(
            csv72,mimetype="text/csv",headers={"Content-disposition":"attachment; filename=POGList_72.csv"})

app.run(debug=True)

template.html

<html>
    <body>
        <h2>Planogram List for Stores</h2>

        {% for n in my_storelist %}

        <p><a href="/getCSV/{{ n }}"> {{ n }} </a></p>

        {% endfor %}

    </body>
</html>

【问题讨论】:

    标签: python python-3.x pandas flask jinja2


    【解决方案1】:

    你需要 url 参数:

    @app.route("/getCSV/<int:store_id>")
    def get_store_csv(store_id):
        selectquery = "EXEC temp_POGListSP" + " " + str(store_id)
        data = pd.read_sql(selectquery, ikbconn)
        table = data.to_csv()
        return Response(
            table,mimetype="text/csv",headers={"Content-disposition":"attachment; filename=POGList_" + str(store_id) + ".csv"})
    

    【讨论】:

    • 非常感谢@Joost,这非常有效,我需要做的就是将商店列表放入配置文件中,然后我就设置好了:) PS - 我已经尝试过 url 参数,但是我犯的错误是把它放在一个遍历商店列表的for循环中,导致以下错误:assertionerror: view function mapping is overwriting an existing endpoint function: getcsv
    猜你喜欢
    • 2016-11-19
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多