Django - Удаление папки FOLDER из amazon S3
Я использую сигналы django post_delete для удаления всех файлов или папок (папок, которые будут пустыми после удаления файлов), связанных с удаленным объектом в моей БД. По какой-то причине я не могу заставить s3 удалять ПАПКИ, даже после поиска многочисленных руководств и сниппетов, может кто-то знает. Я использую django 3.2.7 и boto3. Вот мой код:
- models.py
- signals.py
import os
import shutil
from django.db.models.signals import post_delete, pre_save
from django.dispatch import receiver
from .models import Album
if os.path.exists('env.py'):
import env
@receiver(post_delete, sender=Album)
def update_on_delete(sender, instance, **kwargs):
"""
Deletes file from filesystem
when corresponding `Album` object is deleted.
"""
if instance.cover:
if 'DEVELOPMENT' in os.environ:
if os.path.isfile(instance.cover.path):
#Delete folder from directory
path_dirs = str(instance.cover.path).split(os.sep)
del path_dirs[-1]
shutil.rmtree("/".join(path_dirs))
else:
#Delete file from s3
instance.cover.delete(save=False)
Я столкнулся с подобной проблемой и использовал рекурсивный вызов для удаления каталогов и содержимого каталогов, что-то подобное может подойти для ваших нужд.
from django.core.files.storage import default_storage
@receiver(post_delete, sender=Album)
def update_on_delete(sender, instance, **kwargs):
""" Recursively remove directories and their contents """
def rm(directory):
dirs, files = default_storage.listdir(directory)
for file in files:
# Delete all files in the current directory
default_storage.delete(f'{directory}{file}')
for dir in dirs:
# Change to next directory; recursive call to delete all files in this directory.
purge(f'{directory}{dir}/')
rm(f'/The/Root/Dir/Here')