Django 1.8缓存破坏+亚马逊S3

时间:2016-02-15 11:13:43

标签: python django caching amazon-s3

我一直在做一些研究,我找到了解释如何使用Django(1.8)缓存清除的文章,但是他们没有解释我的情况。

我在settings.py中使用了S3(并且它可以正常工作):

STATICFILES_STORAGE= 'pms.s3utils.StaticRootS3BotoStorage'

为了使用缓存清除docs说我必须设置:STATICFILES_STORAGE='django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

我不知道使用什么设置来同时使用S3和缓存清除。

谢谢!

1 个答案:

答案 0 :(得分:12)

所以我终于找到了解决方法。

为了能够将我的文件上传到我的S3存储桶中的2个不同的文件夹(静态和上传),我在settings.py文件中有这个:

STATICFILES_STORAGE = 'myapp.s3utils.StaticRootS3BotoStorage'
DEFAULT_FILE_STORAGE = 'myapp.s3utils.MediaRootS3BotoStorage'

这在myapp.s3utils.py文件中:

from storages.backends.s3boto import S3BotoStorage

StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static')
MediaRootS3BotoStorage  = lambda: S3BotoStorage(location='uploads')

但是我无法使用Django的缓存破坏。 解决方案是将我的myapp.s3utils.py文件更改为:

from storages.backends.s3boto import S3BotoStorage

from django.contrib.staticfiles.storage import ManifestFilesMixin

class CustomS3Storage(ManifestFilesMixin, S3BotoStorage):
    pass

StaticRootS3BotoStorage = lambda: CustomS3Storage(location='static')
MediaRootS3BotoStorage  = lambda: S3BotoStorage(location='uploads')

基本上它添加了 ManiFestfilesMixin ,它允许你使用缓存清除。

作为旁注,您可以看到我仅对静态文件使用缓存清除,但对上载文件不使用缓存清除。这就是 MediaRootS3BotoStorage 调用 S3BotoStorage 类而不是 CustomS3Storage 的原因。 我是这样做的,因为上传文件没有存储在我的服务器中(静态文件是),它们直接存储在S3存储桶中,所以当我运行 collectstatic 时,它们不在我的服务器上,所以我不必将哈希添加到名称中。