new instalar community app python django pycharm

python - instalar - Pycharm: establecer la variable de entorno para ejecutar la tarea manage.py



pycharm download (12)

He movido mi valor SECRET_KEY fuera de mi archivo de configuración, y se establece cuando cargo mi virtualenv. Puedo confirmar que el valor está presente desde el python manage.py shell .

Cuando ejecuto la consola de Django, falta SECRET_KEY , como debería. Por lo tanto, en las preferencias, voy a Console> Django Console y cargo SECRET_KEY y el valor apropiado. Vuelvo a la consola Django y SECRET_KEY está allí.

Como era de esperar, todavía no puedo ejecutar una tarea manage.py porque todavía tiene que encontrar SECRET_KEY . Así que voy a Ejecutar> Editar configuraciones para agregar SECRET_KEY en el servidor Django y Pruebas Django, y en el servidor del proyecto. Reinicie Pycharm, confirme las claves.

Cuando ejecuto una tarea manage.py, como runserver , sigo obteniendo KeyError: ''SECRET_KEY''.

¿Dónde pongo esta llave?


Aquí está mi archivo manage.py en caso de que ayude. Lee todas las variables del archivo .env ubicado en el directorio raíz de mi proyecto.


Como Pycharm no se inicia desde un terminal, su entorno no se cargará. En resumen, cualquier programa GUI no heredará las variables SHELL. Ver this por razones (suponiendo una Mac).

Sin embargo, hay varias soluciones básicas para este problema. Como se publicó @user3228589 , puede configurarlo como una variable dentro de PyCharm. Esto tiene varios pros y contras. Personalmente, no me gusta este enfoque porque no es una single source . Para solucionarlo, utilizo una pequeña función en la parte superior de mi archivo settings.py que busca la variable dentro de un archivo .env local. Puse todas mis cosas "privadas" allí. También puedo hacer referencia a esto en mi virtualenv.

Esto es lo que parece.

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

Entonces el archivo env se ve así:

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

Y finalmente tu virtualenv / bin / postactivate puede fuente este archivo. Podrías ir más allá y exportar las variables como se describe here si lo deseas, pero dado que el archivo de configuración llama directamente al .env, en realidad no es necesario.


En Pycharm, manage.py tareas de manage.py ejecutan en un proceso aislado que no tiene acceso a las variables de entorno (no es lo mismo que ejecutar / depurar).

La solución más simple es hacer que su código python sea consciente de las variables de entorno .env directamente desde su archivo .env .

Eche un vistazo a: github.com/joke2k/django-environ

import environ env = environ.Env.read_env() # reading .env file SECRET_KEY = env(''SECRET_KEY'')

De esta forma, tiene una única fuente de configuraciones y menos configuraciones en el IDE.

Espero que ayude,


Estoy intentando esta configuración actualmente. Tengo un archivo env.local en mi raíz del proyecto. Mi manage.py ve así:

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

Luego, simplemente paso --load-env en el diálogo de ejecución de PyCharm y todas las variables de entorno se cargarán durante el tiempo de la ejecución.



Lo mismo aquí, por alguna razón PyCharm no puede ver env exportados. Por ahora configuro SECRET_KEY en PyCharm Run / Debug Configurations -> "Variables de entorno"


Otra opción que funcionó para mí:

  1. Abre una terminal
  2. Activa el virtualenv del proyecto que hará que los ganchos se ejecuten y establezca las variables de entorno
  3. Inicie PyCharm desde esta línea de comando.

Pycharm tendrá acceso a las variables de entorno. Probablemente debido a que algo tiene que ver con el proceso PyCharm siendo hijo del caparazón.


Para establecer las variables de su entorno en PyCharm, haga lo siguiente:

  • Abra el menú ''Archivo''
  • Haga clic en ''Configuración''
  • Haga clic en el signo ''+'' al lado de ''Consola''
  • Haga clic en la consola de Python
  • Haga clic en el botón ''...'' al lado de las variables de entorno
  • Haga clic en ''+'' para agregar variables de entorno

Parafraseando respuesta de , en lugar de utilizar la búsqueda predeterminada de Mac doble clic o foco para iniciar PyCharm, puede ejecutarlo directamente desde la terminal. Esto heredará todas sus variables de entorno desde su sesión de terminal a la aplicación PyCharm.

Así es como resuelvo este problema.

  1. Desde su programa de terminal, ejecute el fragmento a continuación.
  2. Valide que las cosas funcionen siguiendo las instrucciones para Editar sus Configuraciones de Ejecutar / Depurar y,
    1. Al hacer clic en ... junto a Environment variables
    2. A continuación, haga clic en Show en la esquina inferior derecha de la pantalla que aparece. Esto mostrará todas las variables de entorno heredadas por el proceso de depuración.
    3. Encuentra tu SECRET_KEY en esta lista. Si no está allí, publique un comentario sobre esta respuesta y podemos intentar resolverlo.
  3. Es probable que deba iniciar PyCharm de esta manera cada vez que lo inicie.

Retazo:

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

Nota al margen

Incluir variables de entorno en un archivo que luego es source ''d es un patrón común para el desarrollo de Django, y la discusión de esa mejor práctica es mejor dejarla sin respuestas.


Puede establecer las variables de entorno de la tarea manage.py a través de:

Preferencias | Idiomas y marcos | Django | Tareas Manage.py

Establecer los parámetros a través de la configuración de ejecución / depuración / consola no afectará la tarea integrada de pycharm de manage.py.


Tenga en cuenta que la respuesta mencionada por "nu everest" funciona, pero no verá la pestaña Consola disponible a menos que cree un proyecto en pycharm. Como los archivos individuales se pueden ejecutar sin crear un proyecto en pycharm, algunas personas pueden estar confundidas. Aunque también debe tener en cuenta que se pierden las configuraciones de ejecución que no pertenecen a un proyecto cuando se cierra pycharm.


basado en @ rh0dium respuesta increíble que hice esta clase:

aquí está mi 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

y dentro de mi runserver.py tengo este código de llamada:

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