Невозможно прочитать переменные окружения в Django с помощью пакета django_configurations

Я использовал django-environ для управления переменными env, все работало хорошо, недавно я перешел на django-configurations.

Мои настройки наследуются от configurations.Configuration, но у меня возникают проблемы с получением значений из файла .env. Например, при извлечении DATABASE_NAME возникает следующая ошибка: TypeError: object of type 'Value' has no len()

Я знаю, что приведенный ниже код возвращает экземпляр value.Value вместо строки, но я не уверен, почему такое поведение. То же самое происходит с любой другой переменной env:

Мой .env. файл выглядит следующим образом:

DEBUG=True
DATABASE_NAME='portfolio_v1'
SECRET_KEY='your-secrete-key'

settings.py файл выглядит следующим образом

 ...
 from configurations import Configuration, values
 DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': values.Value("DATABASE_NAME", environ=True),
 ...

Я проверил, что мой файл `.env' существует и находится на правильном пути. Любая помощь будет принята с благодарностью.

Я потратил больше времени на решение вышеупомянутой проблемы и обнаружил, чего не хватает. Префиксация переменных .env обязательна в django-configuration как поведение по умолчанию.

При работе с dict ключами мы должны предоставить environ_name kwarg экземпляру Value

ПРИМЕЧАНИЕ: переменные .env должны иметь префикс DJANGO_, даже если вы указываете environ_name. Если вы хотите отменить префикс, вы должны указать environ_prefix), т.е.

    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': values.Value(environ_name="DATABASE_NAME"), # provide DJANGO_DATABASE_NAME='portfolio_v1' in .env file

другими вариантами использования являются:

VAR = values.Value()   # works, provided DJANGO_VAR='var_value'
VAR = values.Value(environ_prefix='MYSITE')    # works, provided MYSITE_VAR='var_value'
CUSTOM_DICT = {
    'key_1': values.Value(environ_required=True),  # doesn't work
    'key_2': values.Value(environ_name='other_key'), # works if provided DJANGO_key_2='value_2' in .env
}

Вы используете django-configurations неправильным образом.

Смотрите исходный код класса Value:

class Value:
    @property
    def value(self):
       ...
    def __init__(self, default=None, environ=True, environ_name=None,
                 environ_prefix='DJANGO', environ_required=False,
                 *args, **kwargs):
       ...

Итак, вы хотите, чтобы значение по умолчанию не было "DATABASE_NAME", а ваша переменная окружения в вашем .env файле должна начинаться с DJANGO_.

Затем для использования значения вы можете использовать свойство value, поэтому ваш файл настроек должен выглядеть так:

...
 from configurations import Configuration, values
 DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': values.Value("DEFAULT_VAL").value, 
                    # No need for environ=True since it is default
 ...
Вернуться на верх