【发布时间】: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'。仍然得到“无”。我的存储桶名称是敏感信息吗?我应该继续将其存储在环境中而不是将其硬编码到设置中吗?