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')
Вернуться на верх