Pycharm: définir la variable d'environnement pour l'exécution manage.py tâche

j'ai déplacé ma valeur SECRET_KEY de mon fichier de paramètres, et elle est définie lorsque je charge mon virtualenv. Je peux confirmer que la valeur est présente de python manage.py shell .

quand je tourne la Console Django, SECRET_KEY est manquant, comme il se doit. Ainsi, dans Préférences, je vais à Console > Django Console et de charger SECRET_KEY et la valeur appropriée. Je retourne dans la Console de Django, et SECRET_KEY est là.

comme prévu, Je ne peux pas encore exécuter un manage.py tâche parce qu'il doit encore trouver le SECRET_KEY . Alors je vais dans Run > Edit Configurations pour ajouter SECRET_KEY dans le serveur Django et les tests Django, et dans le serveur de projet. Redémarrez Pycharm, confirmez les clés.

quand je cours un manage.py tâche, comme runserver , je reçois toujours KeyError: 'SECRET_KEY'.

Où dois-je mettre cette clé?

30
demandé sur Cole 2014-02-04 02:07:26

12 réponses

parce que Pycharm n'est pas lancé à partir d'un terminal, votre environnement ne sera pas chargé. En bref, tout programme GUI n'héritera pas des variables SHELL. Voir ce pour des raisons (en supposant une Mac).

cependant, il y a plusieurs solutions de base à ce problème. Comme @user3228589 posté, vous pouvez configurer cela comme une variable dans PyCharm. Cela a plusieurs avantages et inconvénients. Personnellement, je n'aime pas cette approche car ce n'est pas un single source . Pour corriger cela, j'utilise une petite fonction au sommet de mon settings.py fichier qui recherche la variable dans un fichier local .env . J'ai mis tous mes "privé" trucs là. Je peux également faire référence à cela dans mon virtualenv.

voilà à quoi ça ressemble.

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

puis le fichier env ressemble à ceci:

#!/bin/sh
#
# This should normally be placed in the ${SITE_ROOT}/.env
#
# DEPLOYMENT DO NOT MODIFY THESE..
SECRET_KEY='XXXSECRETKEY'

et enfin votre virtualenv/bin / postactivate peut être à la source de ce fichier. Vous pouvez aller plus loin et exporter les variables comme décrit ici si vous le souhaitez, mais depuis le fichier paramètres appelle directement le .env, il n'y a pas vraiment de besoin.

39
répondu rh0dium 2017-11-22 08:51:13

pour définir vos variables d'environnement dans PyCharm faites ce qui suit:

  • ouvrir le menu "Fichier
  • Cliquez Sur "Paramètres"
  • cliquez sur le signe " + "à côté de "Console"
  • , Cliquez Sur Console Python
  • cliquez sur le '..."bouton à côté des variables d'environnement
  • cliquez sur le " + "pour ajouter les variables d'environnement
20
répondu nu everest 2014-04-06 20:56:10

Même ici, pour quelque raison PyCharm ne peux pas le voir exporté env vars. Pour L'instant, J'ai défini SECRET_KEY dans les Configurations D'exécution/débogage de PyCharm - > "variables D'environnement "

13
répondu ammonium 2014-02-06 12:56:10

vous pouvez définir le manage.py variables d'environnement de tâche via:

Préférences| Langues&Cadres| Django| Manage.py les tâches

paramétrer les vars env via la configuration run/debug/console n'affectera pas la configuration intégrée dans pycharm manage.py tâche.

9
répondu OmriToptix 2015-02-25 15:58:44

une autre option qui a fonctionné pour moi:

  1. ouvrir un terminal
  2. activer le virtualenv du projet qui fera fonctionner les crochets et définir les variables d'environnement
  3. Lancez PyCharm depuis cette ligne de commande.

Pycharm aura alors accès aux variables d'environnement. Probablement parce que quelque chose à voir avec le processus PyCharm étant un enfant de la coquille.

9
répondu Antero Ortiz 2015-05-21 12:48:13

In Pycharm manage.py les tâches s'exécutent dans un processus isolé qui n'a pas accès à vos variables d'environnement (pas la même chose que Run/Debug).

la solution la plus simple est de rendre votre code python conscient des variables d'environnement en les lisant directement à partir de votre fichier .env .

regardez: https://github.com/joke2k/django-environ

import environ

env = environ.Env.read_env() # reading .env file

SECRET_KEY = env('SECRET_KEY')

comme ça vous avez un single source de configurations, et moins de réglages dans L'IDE.

Espère que ça aide,

5
répondu cvng 2016-08-06 19:46:43

pour paraphraser la réponse de @antero-ortiz, au lieu d'utiliser la recherche par défaut Mac double-click ou spotlight pour lancer PyCharm, vous pouvez le lancer directement à partir du terminal. Cela héritera de toutes les variables d'environnement de votre session de terminal à l'application PyCharm.

Voici comment je résous ce problème.

  1. depuis votre terminal, Lancez l'extrait ci-dessous.
  2. valider que les choses ont fonctionné en suivant les instructions de éditer vos Configurations D'exécution / débogage et,
    1. en cliquant sur le ... à côté de Environment variables
    2. Puis en cliquant sur Show en bas à droite de l'écran qui apparaît. Cela affichera tout des variables d'environnement héritées par le processus de débogage.
    3. Trouvez votre SECRET_KEY dans cette liste. Si elle n'est pas là, post un commentaire sur cette réponse et nous pouvons essayer de le comprendre!
  3. vous aurez probablement besoin de lancer PyCharm de cette façon à chaque fois que vous le démarrer.

Extrait de:

# 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's probably in /opt/homebrew-cask/Caskroom/pycharm
open $(locate PyCharm.app | egrep 'PyCharm.app$')

note

y compris les variables d'environnement dans un fichier qui est alors source 'D est un modèle commun pour le développement de Django, et la discussion de cette meilleure pratique est mieux réponse.

2
répondu Ben 2017-05-23 12:34:28

basé sur @rh0dium réponse incroyable j'ai fait cette classe:

voici mon 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

et à l'intérieur de mon runserver.py j'ai ce code d'appel:

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']
0
répondu danfromisrael 2015-04-09 18:37:05

la réponse de @(nu everest) n'a pas fonctionné pour moi. Tout ce que vous avez décrit dans la question a fonctionné pour moi. Vous pouvez définir toutes les variables d'environnement dans la boîte de dialogue Exécuter/déboguer les Configurations. C'est w. R. t PyCharm 2016.1 et aussi selon https://www.jetbrains.com/help/pycharm/2016.1/run-debug-configuration-python.html?origin=old_help

0
répondu Nitin 2016-04-09 05:03:44

je suis en train d'essayer cette configuration. J'ai un fichier env.local dans ma racine de projet. Mon manage.py ressemble à ceci:

#!/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)

ensuite je passe juste --load-env dans la boîte de dialogue d'exécution de PyCharm et toutes les variables d'environnement seront chargées pour l'Heure de l'exécution.

0
répondu jaywink 2016-04-09 10:45:58

veuillez noter que la réponse mentionnée par" nu everest " fonctionne mais vous ne verrez pas l'onglet Console disponible à moins que vous ne créiez un projet dans pycharm. Comme les fichiers individuels peuvent être exécutés sans créer de projet dans pycharm, certaines personnes peuvent être confuses. Bien que vous devez également noter que les paramètres sont perdus pour exécuter-des configurations qui n'appartiennent pas à un projet lorsque pycharm est fermé.

0
répondu Part 2016-12-17 16:13:05

Voici mon manage.py file au cas où ça t'aiderait. Il lit toutes les variables .env fichier situé dans le répertoire racine de mon projet.

enter image description here

0
répondu saran3h 2018-07-23 05:02:56