【问题标题】:Heroku/Django/S3: Static files not serving from S3, even though media is workingHeroku/Django/S3:静态文件不从 S3 提供服务,即使媒体正在工作
【发布时间】:2019-03-09 00:31:09
【问题描述】:

不久前,我将我的 Heroku/Django 应用程序配置为使用 this tutorial 从 S3 提供媒体文件。我当时只关心 S3 上的媒体文件,所以我最初没有使用自定义存储,并将文件存储在我的 S3 存储桶的根目录中。但它正在工作。

但是,现在我想将我的静态文件存储在 S3 上,因为我有一些静态视频,而且它们比我想从我的测功机提供的要大。但是当我根据教程配置静态文件时,它们仍然从测功机中提供服务。这是我的设置:

...

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.

【问题讨论】:

  • 如果您仍然无法使用,请联系我们,该教程中的设置配置与我的设置略有不同,我很乐意查看您的设置。跨度>

标签: django heroku amazon-s3


【解决方案1】:

我也遇到过这个问题。

当我在本地主机上运行我的网站时,图像和静态内容从我的 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-05-23
      • 2012-10-29
      • 2023-03-25
      • 2017-10-15
      • 2012-09-30
      • 2012-07-07
      • 2013-12-27
      • 1970-01-01
      • 2016-12-22
      相关资源
      最近更新 更多