Python 使用s3boto忽略媒体URL的Django存储
我尝试在我的应用程序中使用带有s3boto的django存储,并尝试从s3提供媒体和静态文件 我的设置文件中有以下设置: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
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