上载和使用静态(适用于Django项目)到AWS S3

时间:2019-07-08 04:27:33

标签: python django amazon-web-services amazon-s3

感谢您抽出宝贵的时间阅读本文。我的问题很简单。

我能够设置collectstatic函数以将静态文件上传到AWS S3,但是有点麻烦。我一直在进行一些更改,现在,我的网站未使用正确的URL来加载CSS文件。因此,我的初始代码将静态文件移到了S3存储桶中,文件夹为“ static”并在此url上引用了它:

https://{project}.s3.amazonaws.com/static/css/bootstrap.min.css

现在,在进行一些更改后,我将其引用了相同的地址,但没有'static'文件夹:

https://{project}.amazonaws.com/css/bootstrap.min.css

相同的事情发生在静态函数上。与其将所有静态内容都加载到“ static”文件夹中,不如将所有内容都加载到存储桶的根目录中。

这是我的设置文件:

settings.py

AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = config('AWS_STORAGE_BUCKET_NAME')
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME

AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}


STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static/'), ]
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATIC_URL = "https://%s/static/" % (AWS_S3_CUSTOM_DOMAIN)

MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
MEDIA_URL = 'https://%s/media/' % (AWS_S3_CUSTOM_DOMAIN)

感谢您提前提供的所有帮助!我非常感谢社区和支持。

最好, 拉苏尔·基列耶夫(Rasul Kireev)

2 个答案:

答案 0 :(得分:1)

如果要将文件存储在存储桶中的静态目录中,则需要覆盖Storage类。

可以说您有一个实用程序模块,并且在其中有一个storages.py文件。然后实现应该是这样的:

# utilities/storages.py

from storages.backends.s3boto3 import S3Boto3Storage

class StaticRootS3Boto3Storage(S3Boto3Storage):
    location = 'static'

然后在设置中使用它:

STATICFILES_STORAGE = 'utilities.storages.StaticRootS3Boto3Storage'

答案 1 :(得分:1)

# constants

STATICFILES_LOCATION = 'static'
STATICFILES_STORAGE = 'custom_storages.StaticStorage'

覆盖s3boto3storage类变量的位置。

# custom_storages.py

from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage

class StaticStorage(S3Boto3Storage):
    location = settings.STATICFILES_LOCATION

您可以按照此article进行参考。