Подтвердить что ты не робот

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'.

Где я могу поместить этот ключ?

4b9b3361

Ответ 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 в настройках

  • файл
  • настройки
  • Язык и рамки
  • Джанго
  • Переменные среды

Вы можете увидеть на изображении

Ответ 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.