首页 > 解决方案 > 在 Elastic Beanstalk Aws React Django 上托管站点时如何从单独的 S3 存储桶加载静态文件

问题描述

设置:在 Elastic Beanstalk 上托管的 React+Django。托管在单独的 S3 存储桶上的静态文件。

我正在尝试使用src="/static/images/logo.png".

在开发中它工作得很好,但在生产中它会向XXX.elasticbeanstalk.com/static/images/logo.png当它应该请求时发送一​​个请求Bucket.amazonaws.com/static/images/logo.png

同时,用户上传的媒体对于 POST 和 GET 请求都非常有效,图像从 Bucket/media/路径存储和获取。我想避免根据环境有条件地编码绝对 url 路径。

我有一个 djangoproduction_settings.py文件:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

STATIC_ROOT = os.path.join(BASE_DIR, "..", "www", "static")
STATIC_URL = '/static/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

AWS_STORAGE_BUCKET_NAME = '****************'
AWS_S3_REGION_NAME = '****************' 
AWS_ACCESS_KEY_ID = '****************'
AWS_SECRET_ACCESS_KEY = '****************'


AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME



STATICFILES_LOCATION = 'static'
STATICFILES_STORAGE = 'custom_storages.StaticStorage'

MEDIAFILES_LOCATION = 'media'
DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage'

custom_storages.py

from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage


class StaticStorage(S3Boto3Storage):
    location = settings.STATICFILES_LOCATION


class MediaStorage(S3Boto3Storage):
    location = settings.MEDIAFILES_LOCATION

谢谢

标签: djangoamazon-web-servicesamazon-s3staticamazon-elastic-beanstalk

解决方案


看来您的STATIC_URL设置不正确。它指的是您的 Web 应用程序项目路径,而不是 S3 存储桶 URL。您可以尝试在下面使用它:

STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)

推荐阅读