【问题标题】:How to load static files from separate S3 bucket when hosting site on Elastic Beanstalk Aws React Django在 Elastic Beanstalk Aws React Django 上托管站点时如何从单独的 S3 存储桶加载静态文件
【发布时间】:2020-09-22 15:12:54
【问题描述】:

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

我正在尝试使用src="/static/images/logo.png" 加载图像。

在开发中它可以完美运行,但在生产中它会向XXX.elasticbeanstalk.com/static/images/logo.png发送请求,而它应该请求Bucket.amazonaws.com/static/images/logo.png

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

我有一个 django production_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

谢谢

【问题讨论】:

    标签: django amazon-web-services amazon-s3 static amazon-elastic-beanstalk


    【解决方案1】:

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

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

    【讨论】:

    • 我认为这将有助于使用 {% load_static %} 将静态文件加载到 index.html 中,但我认为它不可能在 reacts .JS 文件中做同样的事情。设置 STATIC_URL 对图像 url 路由到src="/static/images/logo.png"的域没有影响
    【解决方案2】:

    你已经扩展了S3Boto3Storage,你可以看到有多个参数,你可以为静态存储类设置额外的env key:

    class StaticStorage(S3Boto3Storage):
        location = settings.STATICFILES_LOCATION
        custom_domain = setting('AWS_S3_CUSTOM_DOMAIN_STATIC')
    

    【讨论】:

    • 我加入了custom_domain = settings.AWS_S3_CUSTOM_DOMAIN,但它似乎不起作用。
    • 你是什么意思你包括 custom_domain = settings.AWS_S3_CUSTOM_DOMAIN
    • 我听从了您的建议,但根据手头的文档和变量使用了 settings.AWS_S3_CUSTOM_DOMAIN。
    • 不,正如我所说,您必须为您的另一个存储桶引入 new 变量并将其捆绑到另一个域
    • 因为 AWS_S3_CUSTOM_DOMAIN 使用第一个存储桶中的 AWS_STORAGE_BUCKET_NAME 您必须为另一个存储桶添加其他变量
    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多