Django:生产环境中不删除sorl-thumbnail缓存文件

时间:2017-01-10 15:11:04

标签: django amazon-s3 sorl-thumbnail

我在django-cleanup项目中使用sorl-thumbnailDjango

我有一个这样的模型:

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 S3cloudfront来管理staticmedia文件。因此,所有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信号。 我不知道为什么会这样。我认为这是一个主要问题 抱歉英语不好(我不是本地人)。真的需要你的帮助。感谢

0 个答案:

没有答案