AWS S3 静态文件访问适用于本地但不适用于生产
AWS S3 static file access works on local but not production
我已经为我的静态文件和媒体文件设置了一个 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 设置是为“*”允许的主机设置的,public 已为所有内容启用访问权限,并且我的 IAM 帐户已启用完整的 s3 访问权限。
非常感谢任何帮助 - 一直在遵循本指南https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html
@Ikaro0 最终是正确的。我使用的 os.environment.get (dotenv) 引起了一些问题,只读取了一些环境文件。切换到 python-decouple.
后工作
我已经为我的静态文件和媒体文件设置了一个 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 设置是为“*”允许的主机设置的,public 已为所有内容启用访问权限,并且我的 IAM 帐户已启用完整的 s3 访问权限。
非常感谢任何帮助 - 一直在遵循本指南https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html
@Ikaro0 最终是正确的。我使用的 os.environment.get (dotenv) 引起了一些问题,只读取了一些环境文件。切换到 python-decouple.
后工作