Almacenando Config en Entorno Python / Django

Me he estado preguntando acerca de esto por un tiempo. A saber, ¿cómo se hace uno para aislar la configuración del código base al hacer proyectos en Python y / o Django?

En particular, estos pensamientos se han inspirado en uno de los 12 factores de Heroku: configuración III.

¿Cuáles son algunas maneras en que uno podría hacer esto? ¿Cómo podría cumplir con este requisito al escribir proyectos en Python, especialmente Django?

Uso de variables de entorno

La forma más común de resolver este problema es usar variables de entorno.

Por ejemplo, en settings.py de una aplicación de Django, podría escribir lo siguiente:

import os if os.getenv("DJANGO_DEBUG") == '1': DEBUG = True 

Las claves API también serían muy similares:

 import os API_KEY = os.getenv("API_KEY", None) 

FlipperPA sugirió otra forma de hacerlo utilizando el paquete django-environ . Fue inspirado por 12factor, por lo que parece ser una combinación perfecta para esta pregunta.

Si implementa utilizando Heroku, puede escribir sus propias variables de entorno para cada dinamómetro en la configuración. Si usa otro método de implementación como AWS CodeDeploy, puede escribir un script de shell para configurar las variables de entorno recuperándolas de un almacén seguro (como AWS Patwigter Store )

Configuración de variables de entorno

Para establecer estas variables de entorno depende de su sistema operativo. Las variables de entorno también se heredan de su línea de comando, por lo que para Linux tendría que agregar la variable de entorno a sus scripts de ejecución y en Windows puede agregar una variable de sistema.

Variable de entorno del sistema de Windows (variable de entorno de acceso universal):

 setx API_KEY abcdefghijklmnopqrstuvwxyz123 

Variable de entorno temporal de Windows (todos los procesos invocados después de ejecutar este comando pueden acceder a la variable):

 set API_KEY abcdefghijklmnopqrstuvwxyz123 

Agregar una variable de entorno para todos los procesos en Linux es más complicado, siga esta respuesta para hacer que una variable de entorno se establezca automáticamente cuando se inicia un shell.

Variable de entorno temporal de Linux (todos los procesos invocados después de ejecutar este comando pueden acceder a la variable):

 export API_KEY="abcdefghijklmnopqrstuvwxyz123" 

Prueba de variables de entorno

Para probar el conjunto de variables de entorno, puede usar el siguiente comando (Reemplace “API_KEY” con cualquiera que sea el nombre de la variable):

Windows:

 echo %API_KEY% 

Linux:

 echo $API_KEY 

Si estas devuelven lo mismo que ingresaste, debería estar funcionando. Puedes probarlo en python escribiendo:

 python 

Entonces deberías ver algo como lo siguiente:

 Python 3.6.2 (default, Jul 17 2017, 16:44:45) [GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> 

Luego puedes escribir tu python para probarlo:

 import os os.getenv("API_KEY") 

Y debería ver impreso el valor de su variable de entorno.