Django 1.8 缓存清除 + 亚马逊 S3

10

我进行了一些研究,找到了一些有关如何使用Django(1.8)的缓存破坏的文章,但它们并没有解决我的问题。

我正在使用S3(它可以工作),并在settings.py中使用以下设置:

STATICFILES_STORAGE= 'pms.s3utils.StaticRootS3BotoStorage'
为了使用缓存破坏,文档中说我必须设置:STATICFILES_STORAGE ='django.contrib.staticfiles.storage.ManifestStaticFilesStorage' 我不知道应该设置什么才能同时使用S3和缓存破坏。
谢谢!
1个回答

14

所以我最终找到了一种解决方法。

为了能够将我的文件上传到S3存储桶中的两个不同文件夹(静态和上传文件夹),我在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时,它们不在我的服务器上,所以我不必将哈希添加到名称中。


1
哇,这拯救了我的一天!!我已经花了几个小时在这上面却没有成功。我不明白为什么这个答案没有更多的正面评价。对于我来说,s3utils.py 的这个简单改变起到了魔法般的作用 :)谢谢啊伙计!!! - rdiaz82
在这种情况下,staticfiles.json 存储在 S3 还是本地文件系统中?它会在每个请求中都被读取吗? - Flimm
回答我的问题,似乎 staticfiles.json 存储在 S3 中,可以公开查看,并且不会在每个请求中读取。 - Flimm
我在使用ManifestFilesMixin时遇到了一些问题,导致错误的文件被上传到S3。如果你也遇到了这个问题,请查看这个问题 - https://stackoverflow.com/questions/52309821/collectstatic-incorrectly-creates-multiple-css-files-in-s3/52323409#52323409 - Jonny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接