标签: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>'
我的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时,它按预期工作并给我相对路径.我在这里错过了什么吗?
解决方法:
当我尝试将Imgix CDN用于我的S3媒体时,我遇到了同样的问题(我怀疑我们都使用了基于你使用custom_storages.py覆盖的same tutorial).
这是django-storages框架中S3BotoStorage类的删节版本.此摘录突出显示了此问题的重要属性和方法,即自定义域属性.
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类中的custom_domain属性添加覆盖.
class MediaStorage(S3BotoStorage):
location = settings.MEDIAFILES_LOCATION
custom_domain = settings.IMGIX_DOMAIN
现在,媒体文件的最终URL应该从您的CDN域开始,然后是S3存储桶上文件的相对路径.
标签:python,django,amazon-s3,django-media,django-storage 来源: https://codeday.me/bug/20190523/1156648.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。