【问题标题】:AWS S3 static file access works on local but not productionAWS S3 静态文件访问适用于本地但不适用于生产
【发布时间】:2021-08-09 09:01:24
【问题描述】:

我已经为我的静态文件和媒体文件设置了一个 AWS S3 存储桶,但它目前仅适用于本地主机,但在我尝试 gunicorn 或部署到 Heroku 时不起作用。

当我查看本地主机上的网络信息时,我可以看到网络正在尝试从“https://mybucketname.s3.amazonaws.com/static/image.png”访问文件。但是,当我在 gunicorn 或 heroku 上尝试此操作时,它正在尝试从“https://none.s3.amazonaws.com/static/image.png”提供文件。

我不确定为什么它使用“none”而不是“mybucketname”,我的设置如下。

settings.py

from pathlib import Path
import os
import django_heroku


BASE_DIR = Path(__file__).resolve().parent.parent

ALLOWED_HOSTS = ['xxxx.herokuapp.com', '127.0.0.1',]

INSTALLED_APPS = [
xxx,
'storages',
]

MIDDLEWARE = [
xxx,
'whitenoise.middleware.WhiteNoiseMiddleware',
]


AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_FILE_OVERWRITE = False
AWS_S3_REGION_NAME = "us-east-1"


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

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

DEFAULT_FILE_STORAGE = 'src.storage_backends.MediaStorage'

# Configure Django App for Heroku.
django_heroku.settings(locals(), staticfiles=False)

如果相关我的 AWS s3 设置设置为“*”允许的主机,则为所有内容启用公共访问,并且我的 IAM 账户启用了完整的 s3 访问。

非常感谢任何帮助 - 一直在关注本指南 https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html

【问题讨论】:

  • 在 gunicorn 上执行此操作后,您如何传递从 os.environment.get 填充的环境变量?您是否尝试过调试 AWS_STORAGE_BUCKET_NAME 的内容?
  • @Ikaro0 - 使用 dotenv 并正确加载存储在与 AWS 信息相同的 env 文件中的 smtp 密钥,因为我收到了通过电子邮件发送的断开链接错误。尝试将信息直接放入设置文件中,因此 AWS_S3_CUSTOM_DOMAIN = 'mybucketname.s3.amazonaws.com'。仍然得到“无”。我的存储桶名称是敏感信息吗?我应该继续将其存储在环境中而不是将其硬编码到设置中吗?

标签: django amazon-s3 heroku


【解决方案1】:

@Ikaro0 最终是正确的。我使用的 os.environment.get (dotenv) 引起了一些问题,只读取了一些环境文件。切换到 python-decouple 后工作。

【讨论】:

    猜你喜欢
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    相关资源
    最近更新 更多