我在django-cleanup
项目中使用sorl-thumbnail
,Django
。
我有一个这样的模型:
from sorl.thumbnail import ImageField
class Variation(BaseModel):
image = ImageField(upload_to=draft_img_upload_location)
我使用信号作为这样的sorl-thumbnail(由https://github.com/un1t/django-cleanup推荐):
from django_cleanup.signals import cleanup_pre_delete
def sorl_delete(**kwargs):
from sorl.thumbnail import delete
delete(kwargs['file'])
cleanup_pre_delete.connect(sorl_delete)
所以,在当地环境中,以下工作:
1.当我在 ADMIN PAGE 中删除Variation
模型时,它会删除BOTH图像文件和图像缓存(由sorl-thumbnail创建)。
2.当我在 ADMIN PAGE 中仅使用其他图像更改图像文件时,它会删除之前的图像文件'和之前的图像缓存文件(由sorl-thumbnail创建)'。
在生产环境中,我使用AWS S3
和cloudfront
来管理static
和media
文件。因此,所有sorl-thumbnail缓存图像文件都存储在S3
中。但每当我使用 ADMIN PAGE 中的其他图像文件更改图像文件时,先前的图像缓存文件(由sorl-thumbnail创建)仍然存在。
假设sorl-thumbnail
图片网址为https://example.cloudfront.net/cache/da/75/abcdefg_i_am_cached_image.jpg
(来自Google开发工具)
在这种情况下,S3
中存在两个图像文件:abcdefg.jpg
和/da/75/abcdefg_i_am_cached_image.jpg
我用另一张图片更改了abcdefg.jpg
。然后,它完全删除了abcdefg.jpg
中的S3 storage
。
现在,我在浏览器中访问了https://example.cloudfront.net/cache/da/75/abcdefg_i_am_cached_image.jpg
并猜测了什么!它显示了此时sorl-thumbnail
缓存的图片!
S3 storage
发生了奇怪的事情。当我尝试检查路径abcdefg_i_am_cached_image.jpg
中是否存在/da/75
时,75
文件夹正下方没有名为da
的目录!
简而言之,abcdefg_i_am_cached_image.jpg
仍然留在S3 storage
!
我不知道为什么这只发生在生产环境中......
这仅是生产模式settings
的一部分。
settings.py
from .partials import *
DEBUG = False
ALLOWED_HOSTS = ["*", ]
STATICFILES_STORAGE = 'spacegraphy.storage.S3PipelineCachedStorage'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = os.environ.get("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.environ.get("AWS_SECRET_ACCESS_KEY")
AWS_STORAGE_BUCKET_NAME = os.environ.get("AWS_STORAGE_BUCKET_NAME")
AWS_S3_CUSTOM_DOMAIN = os.environ.get("AWS_S3_CUSTOM_DOMAIN")
AWS_S3_URL_PROTOCOL = 'https'
AWS_S3_HOST = 's3-ap-northeast-1.amazonaws.com'
STATIC_URL = "https://this-is-my-example.cloudfront.net/"
INSTALLED_APPS += [
'storages',
'collectfast'
]
AWS_PRELOAD_METADATA = True
storage.py
from django.contrib.staticfiles.storage import CachedFilesMixin, ManifestFilesMixin
from pipeline.storage import PipelineMixin
from storages.backends.s3boto import S3BotoStorage
class S3PipelineManifestStorage(PipelineMixin, ManifestFilesMixin, S3BotoStorage):
pass
class S3PipelineCachedStorage(PipelineMixin, CachedFilesMixin, S3BotoStorage):
pass
经过几个小时的调试后,我发现只有生产环境 !!才会调用sorl_delete
信号。
我不知道为什么会这样。我认为这是一个主要问题
抱歉英语不好(我不是本地人)。真的需要你的帮助。感谢