@Atroshchenko-Dima
Python, postgres

Как исправить ошибку [Errno 13] Permission denied?

Есть веб сайт с выгрузкой таблицы из БД, мне нужно реализовать скачивание данной таблицы при выбранных пользователем датах в формате xlsx.
Появляется такая ошибка.
[2023-05-10 14:52:28,917] ERROR in app: Exception on /download [GET]
Traceback (most recent call last):
  File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 2528, in wsgi_app
    response = self.full_dispatch_request()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 1825, in full_dispatch_request
    rv = self.handle_user_exception(e)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 1823, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\app.py", line 1799, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\antrodmi\Desktop\toplivobdd\app.py", line 77, in download
    workbook.save(filepath)
  File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\openpyxl\workbook\workbook.py", line 386, in save
    save_workbook(self, filename)
  File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\site-packages\openpyxl\writer\excel.py", line 291, in save_workbook
    archive = ZipFile(filename, 'w', ZIP_DEFLATED, allowZip64=True)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\antrodmi\AppData\Local\Programs\Python\Python311\Lib\zipfile.py", line 1281, in __init__
    self.fp = io.open(file, filemode)
              ^^^^^^^^^^^^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\Default\\Downloads\\toplivo.xlsx'


Подскажите, пожалуйста, как исправить эту ошибку.

Мой код:

@app.route("/download", methods=["GET","POST"])
def download():
        if request.method == "GET":
    # Получаем начальную и конечную даты из скрытых полей на поле
            start_date = request.args.get("start_date")
            end_date = request.args.get("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("C:\\Users\\Default\\Downloads", filename)

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

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


if __name__ == "__main__":
    app.run()
  • Вопрос задан
  • 789 просмотров
Пригласить эксперта
Ответы на вопрос 1
@rababo9996
Developer
Hi,

You can try altering the filepath to a location where your program has the appropriate rights to write files to resolve this error. You could also use the 'tempfile' module to create a temporary file in a location where the program can write, and then send that file as the download instead.

For example, you may change the 'filepath' line to read:

import tempfile
...
filename = "toplivo.xlsx"
with tempfile.TemporaryDirectory() as tmpdir:
    filepath = os.path.join(tmpdir, filename)
    ...
    # Save workbook and return file for download


This will create a temporary directory where your program is allowed to write files, and create the "toplivo.xlsx" file inside that directory.

I hope this helps!
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы