@Atroshchenko-Dima
Python, postgres

Как исправить ошибку при добавлении скачивания выгрузки из БД на сайте?

При запуске приложения я вижу полную таблицу из БД, форму для ввода начальной и конечной даты и кнопку скачать. Если выбрать даты, то таблица перестраивается в соответствии с выбранными начальной и конечной датами.

Мне нужно реализовать скачивания данной таблицы в формате xlsx(учитывая даты которые выбрал пользователь). Написал код, но при нажатии на кнопку скачать меня просто каждый раз перебрасывает на главную страницу сайта.
Подскажите, пожалуйста, в чем моя ошибка и как правильно должен выглядеть код?

Файл app.py
conn = psycopg2.connect(**params)

@app.route("/", methods=["GET","POST"])
def index():
    cur = conn.cursor()
    cur.execute("SELECT * FROM toplivo;")
    rows = cur.fetchall()
    cur.close
    
    if request.method == "POST":
        # Получаем промежуток дат из формы
        start_date = request.form["start_date"]
        end_date = request.form["end_date"]
        # Форматируем даты в соответсвии с форматом в базе данных
        start_date = datetime.strptime(start_date,"%Y-%m-%d")
        end_date = datetime.strptime(end_date,"%Y-%m-%d")
        # Запрос к БД с использованием параметров дат
        cur = conn.cursor()
        cur.execute("SELECT * FROM toplivo WHERE date BETWEEN %s AND %s ORDER BY date ASC;",(start_date,end_date)) 
        rows = cur.fetchall()
        cur.close
        # Отоброжение полученных данных на странице
        return render_template("index.html", rows=rows, form_visible=True)
    else:
        return render_template("index.html",rows=rows, form_visible=False)


@app.route("/download", methods=["GET","POST"])
def download():
        if request.method == "POST":
    # Получаем начальную и конечную даты из скрытых полей на поле
            start_date = request.form["start_date"]
            end_date = request.form["end_date"]
        # Форматируем даты в соответсвии с форматом в базе данных
            start_date = datetime.strptime(start_date,"%Y-%m-%d")
            end_date = datetime.strptime(end_date,"%Y-%m-%d")
        # Запрос к БД с использованием параметров дат
            cur = conn.cursor()
            cur.execute("SELECT * FROM toplivo WHERE date BETWEEN %s AND %s ORDER BY date ASC;",(start_date,end_date)) 
            rows = cur.fetchall()
            cur.close

            filename = "toplivo.xlsx"
            filepath = os.path.join("downloads", filename)

        # создаем новую книгу excel
            workbook = openpyxl.Workbook()
        # Получаем активный лист
            worksheet = workbook.active()
        # Заполняем таблицу данными из запроса к базе данных
            worksheet.append(["Месяц", "Контрагент","Вид обязательств", "Договор", "Номер счет фактуры", "Дата", "Станция", "k", "Количество, тыс.тут.куб.м", "Стоимость без НДС, руб.", "Цена руб./тыс.м3", "Калорийность поставщика", "Калорийность электростанции", "Количество, тут","Цена руб./тут", "Для средневзвеса калорийности поставщика", "Для средневзвеса калорийности станции", "Скачать договор"])
            for row in rows:
                worksheet.append(list(rows))
        # Сохраняем результат в файл
            workbook.save(filepath)

        # Возвращаем файл на скачивание
            return send_from_directory(directory="downloads", filename=filename, as_attachment=True)
        else:
            return redirect(url_for("index"))


Файл index.html
{% if form_visible %}
    <form method ="post" action="/">
    <label for="start_date  ">Дата с:</label>
    <input type="date" id ="start_date"name ="start_date"><br><br>

    <label for="end_date">Дата по:</label>
    <input type="date" id ="end_date"name ="end_date"><br><br>

    <input type = "submit" value="Применить">

    <a href = "{{url_for('download', start_date=request.form['start_date'], end_date=request.form['end_date'])}}">Скачать</a>
    </form>
{% endif %}
{% if not form_visible %}
    <form method ="post" action="/">
    <label for="start_date  ">Дата с:</label>
    <input type="date" id ="start_date"name ="start_date"><br><br>

    <label for="end_date">Дата по:</label>
    <input type="date" id ="end_date"name ="end_date"><br><br>

    <input type = "submit" value="Применить">

    <a href = "{{url_for('download',start_date=request.form['start_date'], end_date=request.form['end_date'])}}">Скачать</a>
    </form>
{% endif %}
  • Вопрос задан
  • 78 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 03:54
1500 руб./за проект
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект