【问题标题】:Django Storages using s3boto ignoring MEDIA_URL使用 s3boto 忽略 MEDIA_URL 的 Django 存储
【发布时间】:2016-04-22 07:04:49
【问题描述】:

我正在尝试在我的应用中使用 django-storages 和 s3boto,并尝试从 s3 提供媒体和静态文件。

我的设置文件中有以下设置:

AWS_STORAGE_BUCKET_NAME = '<bucket_name>'
AWS_S3_ACCESS_KEY_ID = '<access_key>'
AWS_S3_SECRET_ACCESS_KEY = '<secret>'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME

STATICFILES_LOCATION = 'static'
STATICFILES_STORAGE = '<custom_storage_satic>'

MEDIAFILES_LOCATION = 'media'
DEFAULT_FILE_STORAGE = '<custom_storage_media>'

而我的 custom_storages.py 是

from django.conf import settings
from storages.backends.s3boto import S3BotoStorage

class StaticStorage(S3BotoStorage):
    location = settings.STATICFILES_LOCATION

class MediaStorage(S3BotoStorage):
    location = settings.MEDIAFILES_LOCATION

当我在 django 中创建图像时,而不是获取图像的相对路径以开头

image.url
'/media/image/<rest_of_the_path>.jpg'

我得到的是绝对网址,类似于

image.url
'https://<s3_bucket_name>.s3.amazonaws.com/media/image/original/'

当我使用本地存储而不是 s3boto 时,它会按预期工作并为我提供相对路径。我在这里遗漏了什么吗?

【问题讨论】:

    标签: python django amazon-s3 django-storage django-media


    【解决方案1】:

    如果您从 S3 存储桶提供静态媒体,您必须使用绝对 URL,因为媒体是从完全不同的服务器提供的。

    【讨论】:

    • 但是如果我想切换我的 s3 存储桶,或者如果我想使用 CDN,该怎么办。从概念上讲,即使您从不同的服务器提供服务,是否有任何理由不存储来自 /media 的媒体网址?
    【解决方案2】:

    我在尝试将 Imgix CDN 用于我的 S3 媒体时遇到了同样的问题(我怀疑我们都在使用 same tutorial,因为您使用了 custom_storages.py 覆盖)。

    这里是 django-storages 框架中 S3BotoStorage 类的精简版。这段摘录重点介绍了此问题的重要属性和方法,即custom-domain 属性。

    class S3BotoStorage(Storage):
        location = setting('AWS_LOCATION', '')
        custom_domain = setting('AWS_S3_CUSTOM_DOMAIN')
    
        def url(self, name, headers=None, response_headers=None, expire=None):
            # Preserve the trailing slash after normalizing the path.
            name = self._normalize_name(self._clean_name(name))
            if self.custom_domain:
                return "%s//%s/%s" % (self.url_protocol, self.custom_domain, filepath_to_uri(name))
    

    正如您在 url 方法中看到的那样,生成了一个 URL 来覆盖 STATIC_URLMEDIA_URL Django 设置。目前,该 URL 的域是使用 AWS_S3_CUSTOM_DOMAIN 设置创建的,这就是您继续看到媒体文件的静态 S3 URL 的原因。

    首先,在您的 Django 设置文件中,添加一个描述您的 CDN 域的设置。

    IMGIX_DOMAIN = 'example.imgix.net'
    

    然后,类似于location 属性的覆盖,在MediaStorage 类中添加custom_domain 属性的覆盖。

    class MediaStorage(S3BotoStorage):
        location = settings.MEDIAFILES_LOCATION
        custom_domain = settings.IMGIX_DOMAIN
    

    现在,媒体文件的最终 URL 应该以 CDN 的域开头,然后是 S3 存储桶上文件的相对路径。

    【讨论】:

      猜你喜欢
      • 2013-01-18
      • 2016-10-29
      • 2012-08-02
      • 2012-03-25
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 2011-06-16
      相关资源
      最近更新 更多