使用Django-storage删除Amazon S3中的文件

时间:2015-03-31 16:44:22

标签: python django amazon-web-services amazon-s3 django-storage

在我的Django项目中,我使用Django-storageS在我的Amazon S3中保​​存媒体文件。

我遵循了这个tutorial(我也使用了Django-rest-framework)。这对我很有用:我可以上传一些图像,我可以在S3存储上看到这些图像。

但是,如果我尝试删除模型的实例(包含ImageField),则不会删除S3中的相应文件。这是正确的吗?我还需要删除S3中的资源。

4 个答案:

答案 0 :(得分:2)

您可以使用以下代码提供其ID(S3存储中的文件名)来删除S3文件:

import boto
from boto.s3.key import Key
from django.conf import settings

def s3_delete(id):
    s3conn = boto.connect_s3(settings.AWS_ACCESS_KEY,
            settings.AWS_SECRET_ACCESS_KEY)
    bucket = s3conn.get_bucket(settings.S3_BUCKET)

    k = Key(bucket)
    k.key = str(id)
    k.delete()

确保您在settings.py中正确设置了S3变量,包括:AWS_ACCESS_KEYAWS_SECRET_ACCESS_KEYS3_BUCKET

答案 1 :(得分:2)

删除记录不会自动删除S3存储桶中的文件。为了删除S3资源,您需要在文件字段中调用以下方法:

model.filefield.delete(save=False)  # delete file in S3 storage

您可以在

中执行此操作
  1. 模型的delete方法
  2. 一个pre_delete信号

下面是一个如何在delete模型方法中实现此目标的示例:

...

  def delete(self){
    self.filefield.delete(save=False)
    super().delete()
  }

答案 2 :(得分:0)

我最终对Django管理面板执行了一个功能,因为我不经常删除文件。
如果您想使用API​​删除文件,则可以在序列化器中编写自己的destroy()

BUCKET_NAME = os.environ.get("AWS_STORAGE_BUCKET_NAME")
s3 = boto3.client('s3')


class UserFileAdmin(admin.ModelAdmin):
    list_display = ('file')
    actions = ['delete_completely']

    def delete_completely(self, request, queryset):
        for filemodel in queryset:
            s3.delete_object(Bucket=BUCKET_NAME, Key=str(filemodel.file))
            filemodel.delete()

    delete_completely.short_description = 'Delete pointer and real file together'

答案 3 :(得分:0)

这在AWS S3中对我有效,希望对您有帮助

import os


@receiver(models.signals.post_delete, sender=YourModelName)
def auto_delete_file_on_delete(sender, instance, **kwargs):
    if instance.image:
        instance.image.delete(save=False)  ## use for aws s3
        # if os.path.isfile(instance.image.path): ## use this in development
        #     os.remove(instance.image.path)