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.