2012-09-09 27 views
11

Al tratar de encontrar un lugar para almacenar y guardar configuraciones más allá de settings.py y la base de datos, utilicé un environment.json para variables de entorno. Importe estos en settings.pyNo se pueden usar variables de entorno para la configuración en Django

Mi problema es que cuando trato de cambiar o almacenar nuevos valores en mi entorno, env, settings.py no nota el cambio, tal vez porque Django lee la hora y el número de veces settings.py.

¿Hay alguna manera en la que pueda usar mis variables de entorno de la manera que deseo y a continuación intente?

# settings.py 
import json 
with open('/home/dotcloud/environment.json') as f: 
    env = json.load(f) 
EMAIL_HOST = env.get('EMAIL_PORT', '500') 

# views.py 
import json 
def site_configuration(request): 
    with open('/home/dotcloud/environment.json') as f: 
     env = json.load(f) 
    if request.method == 'POST': 
     os.environ['EMAIL_PORT'] = request.POST['email_port'] 
    return render(request, ...) 

# python manage.py shell demo 
>>> import json 
>>> with open('/home/dotcloud/environment.json') as f: 
...  env = json.load(f) 
... 
>>> project_settings.EMAIL_PORT 
'500' 
>>> env['EMAIL_PORT'] 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
KeyError: 'EMAIL_PORT' 
>>> env['EMAIL_PORT'] = "123" 
>>> env['EMAIL_PORT'] 
'123' 
>>> project_settings.EMAIL_PORT 
'500' 
>>> project_settings.EMAIL_PORT == env['EMAIL_PORT'] 
False' 

Y si no es así, de qué otra manera podría almacenar la configuración de variables que son retirados por settings.py en alguna parte de mi proyecto Django?

Respuesta

7

veo la cuestión cambió ligeramente, las respuestas originales están todavía por debajo pero éste tiene una respuesta ligeramente diferente:


En primer lugar, asegúrese de que está utilizando el settings.py derecha (print 'This file is being loaded' debe hacer el truco).

En segundo lugar, personalmente desaconsejaría usar archivos json para configuración, ya que es menos dinámico que los archivos de Python, pero debería funcionar independientemente.

Mi forma recomendada de hacer algo como esto:

  1. crear un archivo base_settings.py con la configuración estándar
  2. crear un settings.py que será la configuración por defecto de importación. Este archivo debe tener un from base_settings import * en la parte superior para heredar la configuración básica.
  3. Si usted quiere tener un archivo de configuración personalizada, dotcloud_settings.py por ejemplo, sólo tiene que añadir from dotcloud_settings import settings (o base_settings) y establecer la variable de entorno DJANGO_SETTINGS_MODULE a dotcloud_settings o your_project.dotcloud_settings dependiendo de su configuración.

Tenga en cuenta que debe tener mucho cuidado al importar módulos de Django desde estos archivos de configuración. Si algún módulo hace un from django.conf import settings, dejará de analizar su configuración después de ese punto.

En cuanto a usar archivos JSON, más o menos el mismo principio de curso:

  • Una vez más, asegúrese de que no tiene nada que importa aquí django.conf.settings
  • hacer que todas las variables dentro de su archivo JSON global para el archivo de configuración:

    importación JSON con abierto ('/ home/dotCloud/environment.json') como f: env = json.load (f) # Un pequeño truco para hacer todas las variables dentro de nuestro env global globales().actualización (env)


Sin embargo, me gustaría recomendar girando a esto y dejar que el archivo de configuración de importación de este módulo en su lugar.

Además, Django no escucha a las variables de entorno por defecto (además de la DJANGO_SETTINGS_MODULE por lo que podría ser el problema también.

+0

El uso de 'putenv()' en el shell ni siquiera cambia el valor del entorno. También está esto: "Cuando' putenv() 'es compatible, las asignaciones a los elementos en' os.environ' se traducen automáticamente en las llamadas correspondientes a 'putenv()'; sin embargo, las llamadas a 'putenv()' no actualizan 'os.environ', por lo que es preferible asignar elementos de os.environ'." Creo que debería encontrar otra forma de almacenar y modificar dinámicamente las configuraciones para el correo electrónico – Kiwi

+1

Vaya ... tienes razón, eliminaré esa parte. El resto del consejo aún cuenta sin embargo :) – Wolph

+0

Oye, al menos aprendí algunas cosas nuevas sobre las operaciones de variables de entorno en Python. ;) – Kiwi

33

Es posible que desee buscar en foreman (GitHub) o honcho (GitHub). Ambos Se buscan los .env un archivo en el directorio actual desde el que se carga variables de entorno locales

Mi .env se parece a esto para la mayoría de los proyectos (yo uso dj-base-url para la configuración de base de datos):.

DATABASE_URL=sqlite://localhost/local.db 
SECRET_KEY=<a secret key> 
DEBUG=True 

En el archivo settings.py, puede cargar estos ajustes de os.environ así:

import os 
DEBUG = os.environ.get('DEBUG', False) 

Si hay ajustes necesarios, puede assert su presencia antes de tratar de introducirlos:

assert 'SECRET_KEY' in os.environ, 'Set SECRET_KEY in your .env file!' 
SECRET_KEY = os.environ['SECRET_KEY'] 

He estado utilizando este método de manejo de configuraciones locales para los últimos proyectos que he comenzado y creo que funciona muy bien. Una advertencia es nunca compromete su .env al control de fuente. Estas son configuraciones locales que existen solo para la configuración actual y deberían ser recreadas para un entorno diferente.

Cuestiones relacionadas