我将我的Heroku / Django应用程序配置为使用this tutorial来提供来自S3的媒体文件。当时我只关心S3上的媒体文件,因此我最初并没有使用自定义存储,而是将文件存储在S3存储桶的根目录中。但是它正在工作。
但是,现在我想将静态文件存储在S3上,因为我有一些静态视频,并且它们比我想从dyno服务的更大。但是,当我根据教程配置静态文件时,它们仍然可以从dyno服务。这是我的设置:
...
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'storages',
...
]
...
# Django storages configuration
AWS_STORAGE_BUCKET_NAME = os.environ.get('S3_BUCKET')
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_AUTO_CREATE_BUCKET = False
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_S3_ENCRYPTION = True
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'static'
# Static file storage
STATICFILES_STORAGE = 'core.custom_storages.StaticStorage'
STATICFILES_LOCATION = 'static'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = 'https://{}/{}/'.format(AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
STATICFILES_FINDERS = (
"django.contrib.staticfiles.finders.FileSystemFinder",
"django.contrib.staticfiles.finders.AppDirectoriesFinder",
)
# Media file storage
DEFAULT_FILE_STORAGE = 'core.custom_storages.MediaStorage'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'media')
...
这是custom_storages.py:
$ cat core/custom_storages.py
# custom_storages.py
from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage
class StaticStorage(S3Boto3Storage):
location = 'static'
class MediaStorage(S3Boto3Storage):
location = ''
再次清楚地说,媒体存储正在工作,并且可以正确地从s3存储桶中使用。因此,让我感到困惑的是静态文件不是。
编辑:当我推送到Heroku时,我在日志中看到了这一点,这向我表明我什至没有复制到S3:
remote: -----> $ python manage.py collectstatic --noinput
remote: 2090 static files copied to '/tmp/build_a69320678067fe5b2ce29ed74018de75/core/staticfiles', 2188 post-processed.
答案 0 :(得分:1)
您应该看到https://stackoverflow.com/a/57049235/11652661
如果您在settings.py中使用“ import django_heroku”
答案 1 :(得分:0)
我也遇到了这个问题。
当我在本地主机上运行站点时,从S3存储桶中正确加载了图像和静态内容,但是在Heroku中却无法正常工作。
我已将import django_heroku
导入到我的设置文件中-这不能单独解决问题。
解决方案:
staticfiles=False
添加django_heroku.settings(locals())
参数,如下所示: django_heroku.settings(locals(), staticfiles=False)
python manage.py collectstatic