Skip to content

Instantly share code, notes, and snippets.

@Bitnik212
Created October 23, 2023 12:53
Show Gist options
  • Save Bitnik212/c5c19df64110643e93b86816873139ac to your computer and use it in GitHub Desktop.
Save Bitnik212/c5c19df64110643e93b86816873139ac to your computer and use it in GitHub Desktop.
Django S3 Storage fix
__author__ = "Николай Витальевич Никоноров (Bitnik212)"
__date__ = "23.10.2023 13:16"
from enum import StrEnum
import urllib3.util
from storages.backends.s3 import S3Storage
class AddressingStyle(StrEnum):
PATH = "path"
DOMAIN = "virtual"
AUTO = "auto"
class CustomS3Storage(S3Storage):
s3_custom_domain: str
s3_bucket_name: str
s3_access_key: str
s3_secret_key: str
url_style: AddressingStyle
s3_default_acl: str
location: str
def __init__(self, **settings):
super().__init__(**settings)
def get_default_settings(self) -> dict:
result: dict = super().get_default_settings()
result.update({"location": self.location})
result.update({"custom_domain": self.s3_custom_domain})
result.update({"bucket_name": self.s3_bucket_name})
result.update({"access_key": self.s3_access_key})
result.update({"secret_key": self.s3_secret_key})
result.update({"default_acl": self.s3_default_acl})
result.update({"addressing_style": self.url_style})
result.update({"endpoint_url": f"https://{self.s3_custom_domain}/"})
return result
def url(self, name, parameters=None, expire=None, http_method=None):
url = super().url(name, parameters, expire, http_method)
parsed_url = urllib3.util.parse_url(url)
url_path = parsed_url.path
if self.url_style is AddressingStyle.DOMAIN:
new_url = f"{self.url_protocol}//{self.s3_bucket_name}.{self.s3_custom_domain}"
else:
new_url = f"{self.url_protocol}//{self.s3_custom_domain}"
return f"{new_url}{url_path}"
@Bitnik212
Copy link
Author

Ситуация. При bash python manage.py collectstatic endpoint_url может изменяться в зависимости от addressing_style, но Django об этом ничего не знает и при получении ссылок на файлы он возвращает на основе custom_domain а не измененный endpoint_url.

Решение:

Я перегрузил метод url в котором и формируется ссылка. И переписал логику формирования ссылки

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment