在我的Django项目中,我使用Django-storageS在我的Amazon S3中保存媒体文件。
我遵循了这个tutorial(我也使用了Django-rest-framework)。这对我很有用:我可以上传一些图像,我可以在S3存储上看到这些图像。
但是,如果我尝试删除模型的实例(包含ImageField),则不会删除S3中的相应文件。这是正确的吗?我还需要删除S3中的资源。
答案 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_KEY
,AWS_SECRET_ACCESS_KEY
和S3_BUCKET
。
答案 1 :(得分:2)
删除记录不会自动删除S3存储桶中的文件。为了删除S3资源,您需要在文件字段中调用以下方法:
model.filefield.delete(save=False) # delete file in S3 storage
您可以在
中执行此操作delete
方法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)