Python 使用s3boto忽略媒体URL的Django存储

Python 使用s3boto忽略媒体URL的Django存储,python,django,amazon-s3,django-storage,django-media,Python,Django,Amazon S3,Django Storage,Django Media,我尝试在我的应用程序中使用带有s3boto的django存储,并尝试从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_ST

我尝试在我的应用程序中使用带有s3boto的django存储,并尝试从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>'
当我在django中创建图像时,不是从

image.url
'/media/image/<rest_of_the_path>.jpg'
image.url
“/media/image/.jpg”
我得到的是绝对url,类似于

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

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

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

我在尝试将Imgix CDN用于S3介质时遇到了同样的问题(根据您使用的
custom_storages.py
override,我怀疑我们都在使用)

这里是django storages框架中类的一个简化版本。此摘录强调了此问题的重要属性和方法,即
自定义域
属性

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\u url
MEDIA\u url
Django设置。当前,url的域是使用
AWS\u S3\u CUSTOM\u domain
设置创建的,这就是为什么您继续看到媒体文件的静态S3 url的原因

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

IMGIX_DOMAIN = 'example.imgix.net'
然后,与重写
location
属性类似,向
MediaStorage
类中的
custom\u domain
属性添加一个重写

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

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

但是如果我想切换S3存储桶,或者如果我想使用CDN,该怎么办?从概念上讲,即使您从另一台服务器提供服务,也有理由不从/media存储媒体URL吗?
class MediaStorage(S3BotoStorage):
    location = settings.MEDIAFILES_LOCATION
    custom_domain = settings.IMGIX_DOMAIN