我正在尝试设置一个 django 项目,将静态文件保存在文件系统中,并将媒体文件上传到亚马逊 s3 存储桶。 django 存储库有 django>4.2 的更新。这曾经很容易,现在,它不适用于新设置:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_STORAGE = 'django.core.files.storage.FileSystemStorage'
# Check if running in a production environment
STORAGES = {
'default': {
'BACKEND': 'storages.backends.s3boto3.S3Boto3Storage',
'OPTIONS': {
'bucket_name': os.getenv('AWS_STORAGE_BUCKET_NAME'),
'region_name': os.getenv('AWS_S3_REGION_NAME', 'us-east-1'),
'default_acl': 'public-read',
'file_overwrite': False,
'custom_domain': f'{os.getenv("AWS_STORAGE_BUCKET_NAME")}.s3.{os.getenv("AWS_S3_REGION_NAME", "us-east-1")}.amazonaws.com',
},
},
'staticfiles': {
'BACKEND': 'django.core.files.storage.FileSystemStorage',
'OPTIONS': {
'location': STATIC_ROOT,
},
}
}
# django-storages configuration for media files
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
MEDIA_URL = f'https://{os.getenv("AWS_STORAGE_BUCKET_NAME")}.s3.{os.getenv("AWS_S3_REGION_NAME", "us-east-1")}.amazonaws.com/media/'
从服务器访问站点时,静态文件仍然指向s3存储桶,例如:
us-east-1.amazonaws.com/media/admin/css/dark_mode.css
这是 django admin 的基本 css。但为什么它要在 /media/ 中寻找文件?
我认为你可以摆脱 Boto3 并使用默认的 storages.backends.s3.S3Storage 后端,而且你还必须通过选项或环境变量传递 AWS 密钥。请参阅下面的工作代码,但在我的例子中,将静态文件和媒体文件存储在 Yandex S3 中。
ENDPOINT = 'storage.yandexcloud.net'
ENDPOINT_URL = 'https://' + ENDPOINT
STATIC_URL = f"{ENDPOINT_URL}/{env.str("BUCKET_NAME")}/static/"
MEDIA_URL = f"{ENDPOINT_URL}/{env.str("BUCKET_NAME")}/media/"
default_storage_backend = "storages.backends.s3.S3Storage"
default_storage_options = {
"access_key": env.str("YOS_ACCESS_KEY"),
"secret_key": env.str("YOS_SECRET_KEY"),
"bucket_name": env.str("BUCKET_NAME"),
"region_name": env.str("BUCKET_REGION"),
"endpoint_url": ENDPOINT_URL,
"custom_domain": f"{ENDPOINT}/{env.str('BUCKET_NAME')}",
"default_acl": 'public-read',
"querystring_auth": False,
"file_overwrite": True,
}
STORAGES = {
"staticfiles": {
"BACKEND": default_storage_backend,
"OPTIONS": {
**default_storage_options,
"location": "static",
}
},
"default": {
"BACKEND": default_storage_backend,
"OPTIONS": {
# add or override options defined in default
**default_storage_options,
"location": "media",
},
},
}
及环境:
YOS_ACCESS_KEY='...'
YOS_SECRET_KEY='...'
BUCKET_NAME=...
BUCKET_REGION=...
对于 AWS 来说应该是:
"custom_domain": f"{env.str(BUCKET_NAME)}.{ENDPOINT}",
和
ENDPOINT = 's3.amazonaws.com'
ENDPOINT_URL = f"https://{env.str(BUCKET_NAME)}.{ENDPOINT}"
...
STATIC_URL = f"{ENDPOINT_URL}/static/"
MEDIA_URL = f"{ENDPOINT_URL}/media/"
我认为您可以保持静态不变,仅更改媒体文件的默认存储。
我使用了https://forum.djangoproject.com/t/storage-4-2-how-to-subclass-default/29190/3官方文档在这里https://django-storages.readthedocs。 io/en/stable/backends/amazon-S3.html