python - secret_key - establecer una variable de entorno en virtualenv
virtualenv python (9)
Tengo un proyecto de Heroku que usa variables de entorno para obtener su configuración, pero utilizo virtualenv para probar mi aplicación localmente primero.
¿Hay alguna manera de establecer las variables de entorno definidas en la máquina remota dentro de virtualenv?
Actualizar
A partir del 17 de mayo de 2017, el archivo README de autoenv indica que probablemente es la mejor opción e implica que el autoenv ya no se mantiene.
Respuesta anterior
Escribí autoenv para hacer exactamente esto:
En caso de que esté utilizando virtualenvwrapper (lo recomiendo encarecidamente), puede definir diferentes enganches (preactivate, postactivate, predeactivate, postdeactivate) utilizando los scripts con los mismos nombres en $VIRTUAL_ENV/bin/
. Necesitas el gancho postactivado.
$ workon myvenv
$ cat $VIRTUAL_ENV/bin/postactivate
#!/bin/bash
# This hook is run after this virtualenv is activated.
export DJANGO_DEBUG=True
export S3_KEY=mykey
export S3_SECRET=mysecret
$ echo $DJANGO_DEBUG
True
Si desea mantener esta configuración en su directorio de proyecto, simplemente cree un enlace simbólico desde su directorio de proyecto a $VIRTUAL_ENV/bin/postactivate
.
$ rm $VIRTUAL_ENV/bin/postactivate
$ ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivate
Incluso podría automatizar la creación de los enlaces simbólicos cada vez que use mkvirtualenv .
Limpiar al desactivar
Recuerde que esto no limpiará después de sí mismo. Cuando desactives el virtualenv, la variable de entorno persistirá. Para limpiar simétricamente, puede agregar $VIRTUAL_ENV/bin/predeactivate
.
$ cat $VIRTUAL_ENV/bin/predeactivate
#!/bin/bash
# This hook is run before this virtualenv is deactivated.
unset DJANGO_DEBUG
$ deactivate
$ echo $DJANGO_DEBUG
Recuerde que si usa esto para las variables de entorno que ya podrían estar configuradas en su entorno, el desarmado dará como resultado que no se ajusten completamente al salir del virtualenv. Entonces, si eso es probable, podrías registrar el valor anterior en algún lugar temporal y luego volver a leerlo en desactivar.
Preparar:
$ cat $VIRTUAL_ENV/bin/postactivate
#!/bin/bash
# This hook is run after this virtualenv is activated.
if [[ -n $SOME_VAR ]]
then
export SOME_VAR_BACKUP=$SOME_VAR
fi
export SOME_VAR=apple
$ cat $VIRTUAL_ENV/bin/predeactivate
#!/bin/bash
# This hook is run before this virtualenv is deactivated.
if [[ -n $SOME_VAR_BACKUP ]]
then
export SOME_VAR=$SOME_VAR_BACKUP
unset SOME_VAR_BACKUP
else
unset SOME_VAR
fi
Prueba:
$ echo $SOME_VAR
banana
$ workon myenv
$ echo $SOME_VAR
apple
$ deactivate
$ echo $SOME_VAR
banana
Instala https://github.com/kennethreitz/autoenv ya sea por
$ pip install autoenv
(o)
$ brew install autoenv
Y luego crea el archivo .env
en tu carpeta de proyectos virtualenv
$ echo "source bin/activate" > .env
Ahora todo funciona bien
Localmente dentro de un virtualenv hay dos métodos que podrías usar para probar esto. La primera es una herramienta que se instala a través de Heroku toolbelt (https://toolbelt.heroku.com/). La herramienta es capataz. Exportará todas las variables de su entorno que están almacenadas en un archivo .env localmente y luego ejecutará procesos de la aplicación dentro de su Procfile.
La segunda forma si buscas un enfoque más ligero es tener un archivo .env localmente y luego ejecutar:
export $(cat .env)
Otra forma de hacerlo diseñada para django, pero debería funcionar en la mayoría de las configuraciones, es usar django-dotenv.
- Original - https://github.com/jacobian/django-dotenv
- Bifurcación más completa- https://github.com/tedtieken/django-dotenv-rw (Escribí esto para poder establecer mi configuración .env remota en webfaction desde mi línea de comando local, heroku me echó a perder)
Si bien hay muchas buenas respuestas aquí, no vi una solución publicada que incluyera desactivar variables de entorno en desactivación y no requiera bibliotecas adicionales más allá de virtualenv
, así que aquí está mi solución que solo implica editar / bin / activate, usando las variables MY_SERVER_NAME
y MY_DATABASE_URL
como ejemplos:
Debería haber una definición para desactivar en el guión de activación, y usted quiere desarmar sus variables al final del mismo:
deactivate () {
...
# Unset My Server''s variables
unset MY_SERVER_NAME
unset MY_DATABASE_URL
}
Luego, al final del guión de activación, establezca las variables:
# Set My Server''s variables
export MY_SERVER_NAME="<domain for My Server>"
export MY_DATABASE_URL="<url for database>"
De esta manera, no tiene que instalar nada más para que funcione, y no termina con las variables sobrantes cuando deactivate
el virtualenv.
Si ya está utilizando Heroku, considere ejecutar su servidor a través de Foreman . Es compatible con un archivo .env
que es simplemente una lista de líneas con KEY=VAL
que se exportará a su aplicación antes de ejecutarse.
Tu podrías intentar:
export ENVVAR=value
en virtualenv_root / bin / activate. Básicamente, el script de activación es lo que se ejecuta cuando comienzas a usar el virtualenv para que puedas poner toda tu personalización allí.
Usando solo virtualenv (sin virtualenvwrapper ), establecer variables de entorno es fácil a través del script de activate
que se obtiene para activar el virtualenv.
Correr:
nano YOUR_ENV/bin/activate
Agregue las variables de entorno al final del archivo de esta manera:
export KEY=VALUE
También puede establecer un gancho similar para desarmar la variable de entorno según lo sugerido por Danilo Bargen en su gran respuesta anterior si es necesario.