簡體   English   中英

Django Storages使用s3boto忽略MEDIA_URL

[英]Django Storages using s3boto ignoring MEDIA_URL

我試圖在我的應用程序中使用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覆蓋的相同教程 )。

這是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))

正如您在url方法中看到的,生成了一個URL來覆蓋STATIC_URLMEDIA_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存儲桶上文件的相對路徑。

如果從S3存儲桶提供靜態媒體,則必須使用絕對URL,因為媒體是從完全不同的服務器提供的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM