Heroku / Django / S3:即使媒体正常运行,静态文件也无法从S3提供服务​​

时间:2018-10-03 17:38:37

标签: django heroku amazon-s3

我将我的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.

2 个答案:

答案 0 :(得分:1)

您应该看到https://stackoverflow.com/a/57049235/11652661

如果您在settings.py中使用“ import django_heroku”

答案 1 :(得分:0)

我也遇到了这个问题。

当我在本地主机上运行站点时,从S3存储桶中正确加载了图像和静态内容,但是在Heroku中却无法正常工作。

我已将import django_heroku导入到我的设置文件中-这不能单独解决问题。

解决方案:

  • 我需要在我的settings.py文件中向staticfiles=False添加django_heroku.settings(locals())参数,如下所示:

django_heroku.settings(locals(), staticfiles=False)

  • 然后从heroku shell运行python manage.py collectstatic