使用 s3boto 忽略的 Django 存储 MEDIA_URL
Django Storages using s3boto ignoring MEDIA_URL
我正在尝试在我的应用程序中将 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'
我得到的是绝对 url,类似于
image.url
'https://<s3_bucket_name>.s3.amazonaws.com/media/image/original/'
当我使用本地存储而不是 s3boto 时,它按预期工作并为我提供了相对路径。我在这里遗漏了什么吗?
如果您从 S3 存储桶提供静态媒体,您必须使用绝对 URL,因为媒体是从完全不同的服务器提供的。
我在尝试将 Imgix CDN 用于我的 S3 媒体时遇到了同样的问题(我怀疑我们都在使用 same tutorial,基于你对 custom_storages.py
覆盖的使用)。
这里是 django-storages 框架中 S3BotoStorage class 的精简版。这段摘录突出了这个问题的重要属性和方法,即 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_URL
和 MEDIA_URL
Django 设置。当前 URL 的域是使用 AWS_S3_CUSTOM_DOMAIN
设置创建的,这就是为什么您继续看到媒体文件的静态 S3 URL。
因此,首先,在您的 Django 设置文件中,添加一个描述您的 CDN 域的设置。
IMGIX_DOMAIN = 'example.imgix.net'
然后,类似于 location
属性 的覆盖,将覆盖添加到 MediaStorage
[=36= 中的 custom_domain
属性 ].
class MediaStorage(S3BotoStorage):
location = settings.MEDIAFILES_LOCATION
custom_domain = settings.IMGIX_DOMAIN
现在,您的媒体文件的最终 URL 应该以您的 CDN 域开头,然后是您的文件在 S3 存储桶上的相对路径。
我正在尝试在我的应用程序中将 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'
我得到的是绝对 url,类似于
image.url
'https://<s3_bucket_name>.s3.amazonaws.com/media/image/original/'
当我使用本地存储而不是 s3boto 时,它按预期工作并为我提供了相对路径。我在这里遗漏了什么吗?
如果您从 S3 存储桶提供静态媒体,您必须使用绝对 URL,因为媒体是从完全不同的服务器提供的。
我在尝试将 Imgix CDN 用于我的 S3 媒体时遇到了同样的问题(我怀疑我们都在使用 same tutorial,基于你对 custom_storages.py
覆盖的使用)。
这里是 django-storages 框架中 S3BotoStorage class 的精简版。这段摘录突出了这个问题的重要属性和方法,即 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_URL
和 MEDIA_URL
Django 设置。当前 URL 的域是使用 AWS_S3_CUSTOM_DOMAIN
设置创建的,这就是为什么您继续看到媒体文件的静态 S3 URL。
因此,首先,在您的 Django 设置文件中,添加一个描述您的 CDN 域的设置。
IMGIX_DOMAIN = 'example.imgix.net'
然后,类似于 location
属性 的覆盖,将覆盖添加到 MediaStorage
[=36= 中的 custom_domain
属性 ].
class MediaStorage(S3BotoStorage):
location = settings.MEDIAFILES_LOCATION
custom_domain = settings.IMGIX_DOMAIN
现在,您的媒体文件的最终 URL 应该以您的 CDN 域开头,然后是您的文件在 S3 存储桶上的相对路径。