Django Static url не работает с {% static %}

У меня статические файлы хранятся в DigitalOcean CDN. У меня есть несколько пространств 1 для клиентов и 1 для статических активов и я использую django-storages.

Вот мой конфиг:

AWS_S3_REGION_NAME = 'nyc3'
AWS_S3_ENDPOINT_URL = f'https://{AWS_S3_REGION_NAME}.digitaloceanspaces.com'
AWS_DEFAULT_ACL = 'private'
AWS_DEFAULT_BUCKET = 'exactestate-staging'
AWS_RESOURCE = session.resource('s3',
                            region_name=AWS_S3_REGION_NAME,
                            endpoint_url=AWS_S3_ENDPOINT_URL,
                            aws_access_key_id=AWS_ACCESS_KEY_ID,
                            aws_secret_access_key=AWS_SECRET_ACCESS_KEY)

AWS_CLIENT = boto3.client('s3',
                      region_name=AWS_S3_REGION_NAME,
                      endpoint_url=AWS_S3_ENDPOINT_URL,
                      aws_access_key_id=AWS_ACCESS_KEY_ID,
                      aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
# Django’s STATIC_URL must end in a slash and the AWS_S3_CUSTOM_DOMAIN must not. It is best to set this variable independently of STATIC_URL.
AWS_S3_CUSTOM_DOMAIN = f'{AWS_DEFAULT_BUCKET}.{AWS_S3_REGION_NAME}.digitaloceanspaces.com'
STATIC_URL = f'https://{AWS_DEFAULT_BUCKET}.{AWS_S3_REGION_NAME}.digitaloceanspaces.com/static/'

STATICFILES_STORAGE = 'storage_backends.StaticStorage'

По какой-то причине, если у меня не установлено: AWS_S3_CUSTOM_DOMAIN = f'{AWS_DEFAULT_BUCKET}.{AWS_S3_REGION_NAME}.digitaloceanspaces.com' установлен, мой тег {% static %} использует AWS_S3_ENDPOINT_URL в качестве значения... но мне нужно, чтобы он использовал то, что я установил для AWS_S3_CUSTOM_DOMAIN.

Обычно установка AWS_S3_CUSTOM_DOMAIN была бы нормальной, но теперь все вызовы file.url также идут в статическое пространство вместо моего клиентского пространства... как я могу это исправить?

Итак, я немного разобрался и решил свою проблему, изменив класс StaticStorage для создания нужных мне URL.

from abc import ABC

from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage


class StaticStorage(S3Boto3Storage, ABC):
    def __init__(self, *args, **kwargs):
        super().__init__( *args, **kwargs)

        if hasattr(settings, 'STAGING') and settings.STAGING is True:
            # will have different static area
            self.bucket_name = 'exactestate-staging'
            self.region_name = 'nyc3'
            self.endpoint = f'https://{self.region_name}.digitaloceanspaces.com'
            # for building static is already in name
            # no cdn for staging
            self.static_url = f'https://{self.bucket_name}.{self.region_name}.digitaloceanspaces.com/'

        else:
            self.bucket_name = 'exactestate-production-static'
            self.region_name = 'nyc3'
            self.endpoint = f'https://{self.region_name}.digitaloceanspaces.com'
            self.static_url = f'https://{self.bucket_name}.{self.region_name}.cdn.digitaloceanspaces.com/'

    location = 'static'
    default_acl = 'public-read'

    # fix to fix the url for staging and prod to have the right url for {% static ... %]
    def url(self, name, parameters=None, expire=None, http_method=None):
        # Preserve the trailing slash after normalizing the path.
        name = self._normalize_name(self._clean_name(name))

        params = parameters.copy() if parameters else {}
        params['Bucket'] = self.bucket.name
        params['Key'] = name
        url = self.bucket.meta.client.generate_presigned_url('get_object', Params=params,
                                                             ExpiresIn=expire, HttpMethod=http_method)
        # if self.querystring_auth:
        #     return url

        val_to_return = self._strip_signing_parameters(url)
        new_val = f'{self.static_url}{name}'        # this works
        return new_val


По сути, моя проблема заключалась в том, что изменение AWS_S3_CUSTOM_DOMAIN изменило домен, используемый для моих файлов, таким образом, что я больше не мог создать свой правильный URL, поскольку он отменял конечный url. Чтобы исправить это, я просто воспользовался методом url() из S3Boto2Storage и убедился, что мой URL был точным для моей CDN.

Вернуться на верх