При нажатии на кнопку скачать, происходит скачивание пустого excel файла. Попробовал два варианта, в обоих случаях одно и тоже. Подскажите, пожалуйста, в чем ошибка. Как нужно исправить код.
Ссылка на скачивание
<a href = "{{url_for('download', columns = request.form.getlist('columns'), year = request.form.getlist('year'), indicators=request.form.getlist('indicators'), station=request.form.getlist('station'))}}" class="btn btn-primary">Скачать</a>
app.py
@app.route("/download", methods=["GET","POST"])
def download():
if request.method == "GET":
# Получение переменных выбранных пользователем и обработка массива для select multiple
year = [int(i) for i in request.form.getlist("year") if i.isdigit()]
station = [str(i) for i in request.form.getlist("station")]
indicators = [str(i) for i in request.form.getlist("indicators")]
columns = [str(i) for i in request.form.getlist("columns")]
# Запрос к БД с использованием параметров переменных
cur = conn.cursor()
cur.execute("SELECT {} FROM fact_indicators WHERE fact_year = ANY(%s) AND fact_indicators = ANY(%s) AND fact_station_name = ANY(%s);"
.format(",".join(["\"{}\"".format(c) for c in columns])),(year, indicators, station))
rows = cur.fetchall()
cur.close
file_obj = io.BytesIO()
# создаем новую книгу excel
workbook = openpyxl.Workbook()
worksheet = workbook.active
worksheet.append(columns)
for row in rows:
worksheet.append(list(row))
workbook.save(file_obj)
file_obj.seek(0)
filename = "fact_T2.xlsx"
response = make_response(file_obj.read())
response.headers["Content-Disposition"] = f"attachment; path={filename}"
response.headers["Content-Type"] = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
return response
else:
return redirect(url_for("index"))
app.py вариант 2
@app.route("/download", methods=["GET","POST"])
def download():
if request.method == "GET":
# Получение переменных выбранных пользователем и обработка массива для select multiple
year = request.form.getlist("year")
year = [int(i) for i in request.form.getlist("year") if i.isdigit()]
station = request.form.getlist("station")
station = [str(i) for i in request.form.getlist("station")]
indicators = request.form.getlist("indicators")
indicators = [str(i) for i in request.form.getlist("indicators")]
columns = request.form.getlist("columns")
columns = [str(i) for i in request.form.getlist("columns")]
# Запрос к БД с использованием параметров переменных
cur = conn.cursor()
cur.execute("SELECT {} FROM fact_indicators WHERE fact_year = ANY(%s) AND fact_indicators = ANY(%s) AND fact_station_name = ANY(%s);"
.format(",".join(["\"{}\"".format(c) for c in columns])),(year, indicators, station))
rows = cur.fetchall()
cur.close
# Имя скачавшегося файла
filename = "fact_T2.xlsx"
# Путь файла(выбран стандартный, downloads)
filepath = os.path.join(os.path.dirname(__file__), filename)
# создаем новую книгу excel
workbook = openpyxl.Workbook()
# Получаем активный лист
worksheet = workbook.active
# Заполняем таблицу данными из запроса к базе данных
worksheet.append(columns)
for row in rows:
worksheet.append(list(row))
# Сохраняем результат в файл
workbook.save(filepath)
# Возвращаем файл на скачивание в папку downloads
return send_from_directory(os.path.dirname(__file__), path=filename, as_attachment=True)
else:
return redirect(url_for("index"))
На самом сайте таблицы выгружается корректно, printы для years, station, indicators, columns выглядят так(везде используется select multiple)
[2020, 2021, 2022]
['челябинск', 'тюмень']
['Выработка электроэнергии -всего']
['fact_year', 'fact_station_name', 'fact_q1', 'fact_q2', 'fact_q3', 'fact_q4', 'fact_annual_values']
В терминале вижу это
"GET /download?columns=fact_year&columns=fact_station_name&columns=fact_q1&columns=fact_q2&columns=fact_q3&columns=fact_q4&columns=fact_annual_values&year=2020&year=2021&year=2022&indicators=Выработка+электроэнергии+-всего&station=челябинск&station=тюмень HTTP/1.1" 200