Django - разделение настроек по окружению. Не удается найти переменную из базовых настроек

Я разделил свою среду django в соответствии с этим постом.

В settings/base.py я BASE_DIR указал:

BASE_DIR = Path(__file__).resolve().parent.parent.parent

В settings/__init__.py у меня есть:

from .base import *
env = os.environ['ENV']
...
if env == 'test':
  from .test import *
...

В settings/test.py у меня есть DATA_VOLUME_BASE_DIR = BASE_DIR / 'scanned_images'.

Я ожидаю, что Django загружает модуль настроек, импортирует settings/base.py, проверяет окружение ('test'), импортирует settings/test.py (что работает) и переменная доступна (что нет). Мой стектрейс:

sid_test_web | Traceback (most recent call last):
sid_test_web |   File "/code/manage.py", line 22, in <module>
sid_test_web |     main()
sid_test_web |   File "/code/manage.py", line 18, in main
sid_test_web |     execute_from_command_line(sys.argv)
sid_test_web |   File "/usr/local/lib/python3.10/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_
sid_test_web |     utility.execute()
sid_test_web |   File "/usr/local/lib/python3.10/site-packages/django/core/management/__init__.py", line 363, in execute
sid_test_web |     settings.INSTALLED_APPS
sid_test_web |   File "/usr/local/lib/python3.10/site-packages/django/conf/__init__.py", line 82, in __getattr__
sid_test_web |     self._setup(name)
sid_test_web |   File "/usr/local/lib/python3.10/site-packages/django/conf/__init__.py", line 69, in _setup
sid_test_web |     self._wrapped = Settings(settings_module)
sid_test_web |   File "/usr/local/lib/python3.10/site-packages/django/conf/__init__.py", line 170, in __init__
sid_test_web |     mod = importlib.import_module(self.SETTINGS_MODULE)
sid_test_web |   File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
sid_test_web |     return _bootstrap._gcd_import(name[level:], package, level)
sid_test_web |   File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
sid_test_web |   File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
sid_test_web |   File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
sid_test_web |   File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
sid_test_web |   File "<frozen importlib._bootstrap_external>", line 883, in exec_module
sid_test_web |   File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
sid_test_web |   File "/code/my_project/settings/__init__.py", line 9, in <module>
sid_test_web |     from .test import *
sid_test_web |   File "/code/my_project/settings/test.py", line 39, in <module>
sid_test_web |     DATA_VOLUME_BASE_DIR = BASE_DIR / 'scanned_images'
sid_test_web | NameError: name 'BASE_DIR' is not defined

Как сделать переменную BASE_DIR доступной?

Вы должны импортировать настройки .base в тестовые настройки, чтобы они стали доступны в test.py

from .base import *
# ... your other test settings

Второе - выбрать, какие настройки вам нравятся в __init__.py.

env = os.environ['ENV']
if env == 'test':
    from .test import *
else:
    from .base import *
Вернуться на верх