用于收集静态的 Django 1.11 + Amazon S3

Posted

技术标签:

【中文标题】用于收集静态的 Django 1.11 + Amazon S3【英文标题】:Django 1.11 + Amazon S3 for collectstatic 【发布时间】:2018-10-31 21:13:54 【问题描述】:

我刚刚尝试在eu-central-1 上使用 Amazon S3 在生产环境中提供我的静态文件。我正在使用 Elastic Beanstalk 和 Django 1.11。此外,我使用 boto3 和包Django Storages。我的问题是即使 collectstatic 工作并且文件现在在 S3 存储桶中,Django Admin 仍然不使用静态文件。

关于上下文,让我给你我使用的设置:

import os

from django.core.exceptions import ImproperlyConfigured

# Static files (CSS, javascript, Images)

STATICFILES_DIRS = [BASE_DIR.parent / 'myproject' / 'static']

INSTALLED_APPS += ['storages', ]


def get_env_variable(var_name):
    """Get the environment variable or return exception."""
    try:
        return os.environ[var_name]
    except KeyError:
        error_msg = 'Set the  environment variable'.format(var_name)
        raise ImproperlyConfigured(error_msg)


AWS_ACCESS_KEY_ID = get_env_variable("ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = get_env_variable("SECRET_ACCESS_KEY")
AWS_S3_SIGNATURE_VERSION = 's3v4'
AWS_S3_OBJECT_PARAMETERS = 
    'CacheControl': 'max-age=86400',

AWS_STORAGE_BUCKET_NAME = get_env_variable("BUCKET_NAME")
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
AWS_LOCATION = 'static'

STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATICFILES_STORAGE = 'config.settings.aws.utils.StaticRootS3BotoStorage'

DEFAULT_FILE_STORAGE = 'config.settings.aws.utils.MediaRootS3BotoStorage'
MEDIA_URL = 'https://%s.s3.amazonaws.com/media/' % AWS_STORAGE_BUCKET_NAME
MEDIA_ROOT = MEDIA_URL

ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'
S3_USE_SIGV4 = True

这些是设置,下面是我写的 utils 函数:

from storages.backends.s3boto3 import S3Boto3Storage


def StaticRootS3BotoStorage(): return S3Boto3Storage(location='static')


def MediaRootS3BotoStorage(): return S3Boto3Storage(location='media')

有人知道出了什么问题吗?为什么 collectstatic 有效,但 Django Admin 没有应用 css 和 javascript?

【问题讨论】:

您是否配置了您的 S3 访问策略?打开开发工具,查看 S3 中的 URL 是否存在 404 或 403 错误?如果您在浏览器中的 html 中有正确的链接,那么您已经正确设置了 Django 以及 AWS 配置的问题。关注caktusgroup.com/blog/2014/11/10/…,虽然有点过时,但仍然为AWS配置提供了很好的参考。另请参阅 CORS 部分,这样您就不会遇到字体和其他一些问题。 @AlexandrTatarinov "打开开发工具并查看 S3 中的 URL 是否存在 404 或 403 错误?"我怎么做?您是指我的弹性 beantalk 控制台中我的 ec2 实例的日志吗?没有 404 或 403 错误。如果您指的是存储桶的开发工具,我不知道如何访问它们。 我的意思是浏览器中的开发工具 @AlexandrTatarinov 它确实返回 403 错误!但在我的设置中,我确实设置了访问密钥和秘密访问密钥。此外 collectstatic 确实有效!那么为什么实际的网站无法访问? @AlexandrTatarinov 你这该死的上帝!谢谢,我永远不会尝试使用常规的 chrome 开发控制台进行调试。多亏了这一点,我发现我只是有一个“/”太多了。将为此发布答案,非常感谢您的帮助! 【参考方案1】:

我只是有一个'/'太多了。

我刚刚更正了以下行:

AWS_S3_CUSTOM_DOMAIN = '%s.s3.eu-central-1.amazonaws.com' % AWS_STORAGE_BUCKET_NAME

现在它可以工作了。

【讨论】:

以上是关于用于收集静态的 Django 1.11 + Amazon S3的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.11 404 页面,而 Debug=True

django 信号介绍 1.11

Django中静态文件之各个配置详解

Django 1.11 admin:创建 OneToOne 关系,它是 admin 中的对象

django收集静态寻找不存在的目录

Django收集静态错误