Можно ли удалить файл после отправки файлов в Django

from django.http import FileResponse
def send_file():
    #some processes
    response = FileResponse(open(file_name, 'rb'),as_attachment=True)
    return response

Я хочу удалить файл после того, как мое веб-приложение отправит его, но мой сервер на Heroku имеет только 512M. Поэтому я не могу использовать слишком много памяти. Как я могу это сделать? Большое спасибо

Самое простое решение - использовать TemporaryFile, который будет удален при закрытии (в вашем случае FileResponse закроет файл).

Если это решение не подходит для вашего случая (потому что файл уже существует в вашем примере), вы можете использовать подход, аналогичный django.db.transaction.on_commit (я имею в виду аналогичный тому, как он реализован в исходном коде):

  • определите очередь для хранения путей файлов, которые будут удалены;
  • реализуйте обработчик очереди для удаления всех файлов из очереди по их файловым путям и очистки очереди;
  • соедините обработчик очереди с request_finished сигналом (Django отправит его, когда закончит доставку HTTP ответа клиенту);
  • выталкивать текущий file_name в очередь во время обработки запроса.

FileResponse будет читать файл кусками по 4 кб (по умолчанию), чтобы передать его клиенту. Файл будет удален с помощью функциональности операционной системы. Поэтому оба этих подхода не будут потреблять много памяти.

Кроме того, вы можете добавить дополнительную периодическую задачу для очистки устаревших файлов, если вам нужно очень надежное решение.

Вернуться на верх