56 lines
2.0 KiB
Python
56 lines
2.0 KiB
Python
|
from django.conf import DEFAULT_STORAGE_ALIAS, STATICFILES_STORAGE_ALIAS, settings
|
||
|
from django.core.exceptions import ImproperlyConfigured
|
||
|
from django.utils.functional import cached_property
|
||
|
from django.utils.module_loading import import_string
|
||
|
|
||
|
|
||
|
class InvalidStorageError(ImproperlyConfigured):
|
||
|
pass
|
||
|
|
||
|
|
||
|
class StorageHandler:
|
||
|
def __init__(self, backends=None):
|
||
|
# backends is an optional dict of storage backend definitions
|
||
|
# (structured like settings.STORAGES).
|
||
|
self._backends = backends
|
||
|
self._storages = {}
|
||
|
|
||
|
@cached_property
|
||
|
def backends(self):
|
||
|
if self._backends is None:
|
||
|
self._backends = settings.STORAGES.copy()
|
||
|
# RemovedInDjango51Warning.
|
||
|
if settings.is_overridden("DEFAULT_FILE_STORAGE"):
|
||
|
self._backends[DEFAULT_STORAGE_ALIAS] = {
|
||
|
"BACKEND": settings.DEFAULT_FILE_STORAGE
|
||
|
}
|
||
|
if settings.is_overridden("STATICFILES_STORAGE"):
|
||
|
self._backends[STATICFILES_STORAGE_ALIAS] = {
|
||
|
"BACKEND": settings.STATICFILES_STORAGE
|
||
|
}
|
||
|
return self._backends
|
||
|
|
||
|
def __getitem__(self, alias):
|
||
|
try:
|
||
|
return self._storages[alias]
|
||
|
except KeyError:
|
||
|
try:
|
||
|
params = self.backends[alias]
|
||
|
except KeyError:
|
||
|
raise InvalidStorageError(
|
||
|
f"Could not find config for '{alias}' in settings.STORAGES."
|
||
|
)
|
||
|
storage = self.create_storage(params)
|
||
|
self._storages[alias] = storage
|
||
|
return storage
|
||
|
|
||
|
def create_storage(self, params):
|
||
|
params = params.copy()
|
||
|
backend = params.pop("BACKEND")
|
||
|
options = params.pop("OPTIONS", {})
|
||
|
try:
|
||
|
storage_cls = import_string(backend)
|
||
|
except ImportError as e:
|
||
|
raise InvalidStorageError(f"Could not find backend {backend!r}: {e}") from e
|
||
|
return storage_cls(**options)
|