Pycharm: установить переменную среды для запуска manage.py Task
Я перенес свое значение SECRET_KEY
из моего файла настроек, и оно устанавливается, когда я загружаю свой virtualenv. Я могу подтвердить, что значение присутствует от python manage.py shell
.
Когда я запускаю консоль Django, SECRET_KEY
отсутствует, как и должно быть. Поэтому в настройках я перехожу в Консоль > Консоль Django и загружаю SECRET_KEY
и соответствующее значение. Я возвращаюсь в консоль Django, и SECRET_KEY
есть.
Как и ожидалось, я еще не могу запустить задачу manage.py, потому что он еще не нашел SECRET_KEY
. Поэтому я перехожу в Run > Edit Configurations, чтобы добавить SECRET_KEY
в Django-сервер и Django Tests, а также в сервер проекта. Перезапустите Pycharm, подтвердите ключи.
Когда я запускаю задачу manage.py, например runserver
, я все равно получаю KeyError: 'SECRET_KEY'.
Где я могу поместить этот ключ?
Ответы
Ответ 1
Поскольку Pycharm не запускается с терминала, ваша среда не будет загружена. Короче говоря, любая программа GUI не наследует переменные SHELL. См. этот по причинам (при условии, что Mac).
Однако есть несколько основных решений этой проблемы. В качестве @user3228589 вы можете установить это как переменную в PyCharm. Это имеет несколько плюсов и минусов. Мне лично это не нравится, потому что это не single source
. Чтобы исправить это, я использую небольшую функцию в верхней части моего файла settings.py, который ищет переменную внутри локального файла .env
. Я поместил все свои материалы "private" там. Я также могу ссылаться на это в моем virtualenv.
Вот как это выглядит.
- settings.py
def get_env_variable(var_name, default=False):
"""
Get the environment variable or return exception
:param var_name: Environment Variable to lookup
"""
try:
return os.environ[var_name]
except KeyError:
import StringIO
import ConfigParser
env_file = os.environ.get('PROJECT_ENV_FILE', SITE_ROOT + "/.env")
try:
config = StringIO.StringIO()
config.write("[DATA]\n")
config.write(open(env_file).read())
config.seek(0, os.SEEK_SET)
cp = ConfigParser.ConfigParser()
cp.readfp(config)
value = dict(cp.items('DATA'))[var_name.lower()]
if value.startswith('"') and value.endswith('"'):
value = value[1:-1]
elif value.startswith("'") and value.endswith("'"):
value = value[1:-1]
os.environ.setdefault(var_name, value)
return value
except (KeyError, IOError):
if default is not False:
return default
from django.core.exceptions import ImproperlyConfigured
error_msg = "Either set the env variable '{var}' or place it in your " \
"{env_file} file as '{var} = VALUE'"
raise ImproperlyConfigured(error_msg.format(var=var_name, env_file=env_file))
# Make this unique, and don't share it with anybody.
SECRET_KEY = get_env_variable('SECRET_KEY')
Затем файл env выглядит следующим образом:
#!/bin/sh
#
# This should normally be placed in the ${SITE_ROOT}/.env
#
# DEPLOYMENT DO NOT MODIFY THESE..
SECRET_KEY='XXXSECRETKEY'
И, наконец, ваш файл virtualenv/bin/postactivate может загрузить этот файл. Вы можете пойти дальше и экспортировать переменные, как описано здесь, если хотите, но так как файл настроек напрямую вызывает .env, на самом деле нет необходимости.
Ответ 2
Чтобы установить переменные среды в PyCharm, выполните следующие действия:
- Откройте меню "Файл"
- Нажмите "Настройки"
- Нажмите знак "+" рядом с "Консоль"
- Нажмите кнопку Python Console
- Нажмите кнопку "..." рядом с переменными среды
- Нажмите "+", чтобы добавить переменные среды.
Ответ 3
То же самое здесь, по какой-то причине PyCharm can not видит экспортированные env vars.
На данный момент я устанавливаю SECRET_KEY в PyCharm Run/Debug Configurations → "Environment variables"
Ответ 4
Вы можете установить переменные среды задачи manage.py с помощью:
Preferences | Языки и амп; Каркасы | Джанго | Задачи Manage.py
Настройка env vars с помощью конфигурации run/debug/console не повлияет на встроенную задачу pycharm manage.py.
Ответ 5
Другой вариант, который работал у меня:
- Откройте терминал
- Активировать virtualenv проекта, который приведет к запуску крючков и настройке переменных среды.
- Запустите PyCharm из этой командной строки.
Затем Pycharm будет иметь доступ к переменным среды. Вероятно, из-за чего-то связанного с процессом PyCharm, являющимся дочерним элементом оболочки.
Ответ 6
В Pycharm manage.py
задачи выполняются в изолированном процессе, который не имеет доступа к вашим переменным среды (не то же самое, что Run/Debug).
Простейшим решением является информирование вашего кода на Python о переменных среды, непосредственно прочитав их из вашего файла .env
.
Взгляните на: https://github.com/joke2k/django-environ
import environ
env = environ.Env.read_env() # reading .env file
SECRET_KEY = env('SECRET_KEY')
Таким образом, у вас есть один источник конфигураций и меньше настроек в среде IDE.
Надеюсь, что это поможет,
Ответ 7
Чтобы перефразировать @antero-ortiz ответ, вместо того, чтобы использовать поиск Mac по двойному щелчку мыши или поиска по умолчанию для запуска PyCharm, вы можете запустить его непосредственно с терминала. Это наследует все ваши переменные среды из сеанса терминала в приложение PyCharm.
Вот как я решаю эту проблему.
- В своей терминальной программе запустите снимок ниже.
- Подтвердите, что все работает, следуя инструкциям Отредактируйте конфигурацию Run/Debug Configurations и,
- Нажав
...
рядом с Environment variables
- Затем нажмите
Show
в правом нижнем углу экрана, который появляется. Это покажет все переменные среды, унаследованные процессом Debug.
- Найдите
SECRET_KEY
в этом списке. Если это не так, отправьте комментарий на этот ответ, и мы сможем попытаться это выяснить!
- Вам, вероятно, придется запускать PyCharm таким образом каждый раз, когда вы его запускаете.
Отрывок:
# This file would presumably export SECRET_KEY
source /path/to/env/file
# This is just a shortcut to finding out where you installed PyCharm
# If you used brew cask, it probably in /opt/homebrew-cask/Caskroom/pycharm
open $(locate PyCharm.app | egrep 'PyCharm.app$')
Боковое примечание
Включение переменных среды в файл, который затем source
'd, является общей схемой разработки Django, и обсуждение этой лучшей практики лучше всего оставить без ответа.
Ответ 8
на основе @rh0dium удивительного ответа я сделал этот класс:
здесь мои settings.py:
import os
class EnvironmentSettings():
"""Access to environment variables via system os or .env file for development
"""
def __init__(self, root_folder_path):
self._root_folder_path = root_folder_path
def __getitem__(self, key):
return self._get_env_variable(key)
def __setitem__(self, key, value):
raise InvalidOperationException('Environment Settings are read-only')
def __delitem__(self, key):
raise InvalidOperationException('Environment Settings are read-only')
def _get_env_variable(self, var_name, default=False):
"""
Get the environment variable or return exception
:param var_name: Environment Variable to lookup
"""
try:
return os.environ[var_name]
except KeyError:
from io import StringIO
from configparser import ConfigParser
env_file = os.environ.get('PROJECT_ENV_FILE', self._root_folder_path + "/.env")
try:
config = StringIO()
config.write("[DATA]\n")
config.write(open(env_file).read())
config.seek(0, os.SEEK_SET)
cp = ConfigParser()
cp.readfp(config)
value = dict(cp.items('DATA'))[var_name.lower()]
if value.startswith('"') and value.endswith('"'):
value = value[1:-1]
elif value.startswith("'") and value.endswith("'"):
value = value[1:-1]
os.environ.setdefault(var_name, value)
return value
except (KeyError, IOError):
if default is not False:
return default
error_msg = "Either set the env variable '{var}' or place it in your " \
"{env_file} file as '{var} = VALUE'"
raise ConfigurationError(error_msg.format(var=var_name, env_file=env_file))
class ConfigurationError(Exception):
pass
class InvalidOperationException(Exception):
pass
и внутри моего сервера server.py у меня есть этот код вызова:
from settings import EnvironmentSettings
root_folder_path = os.path.dirname(os.path.abspath(__file__))
env_settings = EnvironmentSettings(root_folder_path)
config_name = env_settings['APP_SETTINGS']
Ответ 9
В PyCharm 2018 вы можете использовать параметр переменных окружения django manage.py в настройках
- файл
- настройки
- Язык и рамки
- Джанго
- Переменные среды
Вы можете увидеть на изображении
Ответ 10
Ответ @(nu everest) не помог мне. Все, что вы описали в вопросе, сработало для меня. Вы можете установить все переменные среды в диалоговом окне "Run/Debug Configurations". Это w.r.t PyCharm 2016.1, а также https://www.jetbrains.com/help/pycharm/2016.1/run-debug-configuration-python.html?origin=old_help
Ответ 11
В настоящее время я пытаюсь настроить эту настройку. У меня есть файл env.local
в корне моего проекта. Мой manage.py
выглядит так:
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
# Load environment variables from env.local, if option --load-env specified.
# Good for injecting environment into PyCharm run configurations for example and no need to
# manually load the env values for manage.py commands
if "--load-env" in sys.argv:
with open("env.local") as envfile:
for line in envfile:
if line.strip():
setting = line.strip().split("=", maxsplit=1)
os.environ.setdefault(setting[0], setting[1])
sys.argv.remove("--load-env")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
Затем я просто передаю --load-env
в диалоговом окне запуска PyCharm, и все переменные среды будут загружены за время выполнения.
Ответ 12
Обратите внимание, что ответ, упомянутый в "nu everest", работает, но вы не увидите вкладку "Консоль", если вы не создадите проект в pycharm. Поскольку отдельные файлы можно запускать без создания проекта в pycharm, некоторые люди могут быть смущены. Хотя вы также должны отметить, что настройки теряются для выполнения конфигураций, которые не принадлежат проекту при закрытии pycharm.
Ответ 13
Вот мой файл manage.py на случай, если это поможет. Он читает все переменные из файла .env, расположенного в корневом каталоге моего проекта.
![enter image description here]()
Ответ 14
Я считаю, что хорошим подходом является использование django-environment, которое позволяет вам читать переменные окружения из файла .env
.
использование
Сначала установите django-environ
pip install django-environ
Во-вторых, создайте файл .env
в том же каталоге, что и ваш файл settings.py
.
$ touch project-name/.env
В-третьих, добавьте переменные окружения, которые вы хотите использовать, в .env
:
# .env file
DEBUG=on
SECRET_KEY=your-secret-key
DATABASE_URL=psql://urser:[email protected]:8458/database
SQLITE_URL=sqlite:///my-local-sqlite.db
В-четвертых, в файле настроек добавьте следующее сразу после операторов импорта:
# other import statements
import environ
# the followin line expects .env file to exist. Otherwise, an IOError exception will be raised.
env = environ.Env.read_env()
В-пятых, загрузите переменные среды:
DEBUG = env('DEBUG')
SECRET_KEY = env('SECRET_KEY')
Это. Если вы хотите получить дополнительную информацию о, пожалуйста, просмотрите документы.
Примечание: эта конфигурация также поможет вам установить переменные среды при запуске сервера из PyCharm.