Можно ли удалить файл после отправки файлов в 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 кб (по умолчанию), чтобы передать его клиенту. Файл будет удален с помощью функциональности операционной системы. Поэтому оба этих подхода не будут потреблять много памяти.
Кроме того, вы можете добавить дополнительную периодическую задачу для очистки устаревших файлов, если вам нужно очень надежное решение.