Невозможно прочитать переменные окружения в 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
...