Переменные окружения Python (django)

Я работаю с django и virtualenvwrapper. Моя цель — удалить всю конфиденциальную информацию из файла настроек в соответствии с предложениями приложения 12Factor (http://12factor.net) и в конечном итоге развернуться на героку. Чтобы добиться этого при локальном тестировании, я создал файл .env с различными значениями переменных, такими как SECRET_KEY. Я пошел в свой каталог virtualenv и добавил следующую строку в сценарий постактивации:

source .env 

Всякий раз, когда я запускаю свою виртуальную среду для проекта, также известного как workon имя_проекта, переменные среды из .env доступны, если я эхо с терминала

$ echo $SECRET_KEY
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Однако, когда я пытаюсь получить доступ к этим переменным из python, они недоступны.

>>> import os
>>> os.environ.get('SECRET_KEY')
>>> 

Как правильно python получить доступ к переменным среды, хранящимся в файле .env?

.env-файл:

WEB_CONCURRENCY=2
SECRET_KEY='XXXXXXXXXXXX'
DEBUG=True

person alexolivas    schedule 29.01.2016    source источник
comment
Вы export определили SECRET_KEY или только что определили SECRET_KEY=xxxxxxx?   -  person Shang Wang    schedule 29.01.2016
comment
Я определил SECRET_KEY внутри .env и получаю файл .env каждый раз, когда запускаю workon имя_проекта. Я никогда явно не экспортировал его или что-то еще внутри файла .env.   -  person alexolivas    schedule 29.01.2016
comment
Нет, я имел в виду то, что вы написали в своем .env файле. У вас было export SECRET_KEY=xxxxx или SECRET_KEY=xxxxxxx?   -  person Shang Wang    schedule 29.01.2016
comment
@alexolivas Пожалуйста, покажите свой файл .env.   -  person Abhyudit Jain    schedule 29.01.2016


Ответы (1)


Я думаю, ваша проблема в том, что вы определяете его в своей текущей оболочке, выполняя SECRET_KEY=xxxxxxx, но когда вы открываете оболочку Python, она выполняется в подпроцессе, и вы потеряли переменную среды в этой оболочке. export также сделает переменную доступной в подпроцессе.

Вы должны иметь:

export SECRET_KEY=xxxxxxxx

В вашем файле .env, чтобы он работал.

Изменить:

Из того, что я прочитал по вашим ссылкам, это обычная переменная среды оболочки Linux. Но django должен иметь SECRET_KEY в качестве константы python в настройках. Переменные среды Linux и переменные python — это две разные вещи, поэтому определение переменной env SECRET_KEY не позволяет django распознавать settings.SECRET_KEY. Вам все равно следует рассмотреть возможность использования отдельного файла настроек, что в большинстве случаев рекомендуется.

person Shang Wang    schedule 29.01.2016
comment
Я следил за руководством по развертыванию django от heroku, и они используют для этого файл env, пример немного неполный, и именно здесь я застрял. Кроме того, я думаю, что чище поддерживать 1 файл настроек, даже если все они наследуются от одних и тех же base_settings для всех общих настроек. Использование экспорта сработало, но теперь я еще больше запутался, чем когда начал, поскольку вы предлагаете, что это не очень хорошая практика. - person alexolivas; 29.01.2016
comment
О, я недостаточно знаю хероку, может быть, я ошибался. Я удалю свое предложение о файле настроек, потому что у heroku может быть какой-то трюк, чтобы заставить его работать с файлом .env. Но я думаю, вы должны понимать, зачем вам нужен export. Если вы все еще хотите использовать несколько файлов настроек, проверьте это: stackoverflow.com/questions/24071489/ - person Shang Wang; 29.01.2016
comment
Кстати, мне все еще интересно, где вы нашли руководство. - person Shang Wang; 29.01.2016
comment
Получается, что нас двое, я только пару дней назад начал узнавать о героку. Я использовал несколько файлов настроек, когда мое приложение размещалось на веб-фракции. Это руководство предназначено для django на героку, а это для локальные переменные конфигурации, которые использует heroku, и как запускать ваш код в процессе разработки. - person alexolivas; 29.01.2016
comment
Кроме того, я понимаю необходимость экспорта. Спасибо! - person alexolivas; 30.01.2016
comment
Я отредактировал свой ответ. Я не думаю, что в руководстве по настройке django упоминается что-либо, связанное с переменной среды, поэтому я думаю, что у heroku нет ничего отличного от обычной Linux-машины. - person Shang Wang; 30.01.2016