Django Storages使用s3boto忽略MEDIA_URL

Soh*_*kar 7 python django amazon-s3 django-media django-storage

我试图在我的应用程序中使用django-storage与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>'
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

当我在django中创建图像时,而不是从我的图像开始的相对路径

image.url
'/media/image/<rest_of_the_path>.jpg'
Run Code Online (Sandbox Code Playgroud)

我得到了绝对的网址,就像这样

image.url
'https://<s3_bucket_name>.s3.amazonaws.com/media/image/original/'
Run Code Online (Sandbox Code Playgroud)

当我使用本地存储而不是s3boto时,它按预期工作并给我相对路径.我在这里错过了什么吗?

Ale*_*ens 5

我在尝试将 Imgix CDN 用于我的 S3 媒体时遇到了同样的问题(我怀疑我们都在使用基于您对覆盖的使用的相同教程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))
Run Code Online (Sandbox Code Playgroud)

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

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

IMGIX_DOMAIN = 'example.imgix.net'
Run Code Online (Sandbox Code Playgroud)

然后,类似于location属性的覆盖,custom_domain在您的MediaStorage类中为该属性添加一个覆盖。

class MediaStorage(S3BotoStorage):
    location = settings.MEDIAFILES_LOCATION
    custom_domain = settings.IMGIX_DOMAIN
Run Code Online (Sandbox Code Playgroud)

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