Created
October 23, 2023 12:53
-
-
Save Bitnik212/c5c19df64110643e93b86816873139ac to your computer and use it in GitHub Desktop.
Django S3 Storage fix
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
__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}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Ситуация. При
bash python manage.py collectstatic
endpoint_url может изменяться в зависимости от addressing_style, но Django об этом ничего не знает и при получении ссылок на файлы он возвращает на основе custom_domain а не измененный endpoint_url.Решение:
Я перегрузил метод url в котором и формируется ссылка. И переписал логику формирования ссылки