不能在Django中使用环境变量进行设置

时间:2012-09-09 00:07:32

标签: python django environment-variables

在尝试查找存储和保存settings.py和数据库之外的设置的地方时,我使用了environment.json作为环境变量。我在settings.py中导入它们。

我的问题是,当我尝试在我的环境中更改或存储新值时,envsettings.py没有注意到更改 - 可能是因为读取了settings.py的时间和次数由Django。

有没有办法可以按照我想要的方式使用我的环境变量?

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

如果没有,我还能如何存储我的Django项目中某处settings.py检索到的可更改设置?

2 个答案:

答案 0 :(得分:33)

您可能需要查看foremanGitHub)或honchoGitHub)。这两个文件都在当前目录中查找.env文件,从中加载本地环境变量。

对于大多数项目,我的.env看起来像这样(我使用dj-database-url进行数据库配置):

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

settings.py文件中,您可以从os.environ加载这些设置,如下所示:

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

如果有必要的设置,您可以在尝试设置之前assert他们的存在:

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

我一直在使用这种方法来处理我已经开始的最后几个项目的本地设置,我认为它的效果非常好。需要注意的是,从不.env提交给源代码控制。这些是仅存在于当前配置的本地设置,应该为不同的环境重新创建。

答案 1 :(得分:7)

我看到问题稍有改动,原来的答案仍在下面,但这个答案略有不同:


首先,请确保使用正确的settings.py(print 'This file is being loaded'应该这样做。)

其次,我个人建议不要使用json文件进行配置,因为它不如Python文件动态,但它应该可以工作。

我推荐做这样的事情:

  1. 使用您的标准设置创建base_settings.py文件
  2. 创建settings.py,这将是您的默认设置导入。此文件顶部应该有一个from base_settings import *来继承基本设置。
  3. 例如,如果您想要自定义设置文件dotcloud_settings.py,只需添加from dotcloud_settings import settings(或base_settings)并将环境变量DJANGO_SETTINGS_MODULE设置为{{ 1}}或dotcloud_settings,具体取决于您的设置。
  4. 请注意,从这些设置文件导入Django模块时应该非常小心。如果任何模块执行your_project.dotcloud_settings,它将在该点之后停止解析您的设置。

    至于使用json文件,当然大致相同的原则:

    • 请再次确保您没有任何导入from django.conf import settings
    • 的内容
    • 将json文件中的所有变量全局设置为您的设置文件:

      导入json 打开('/ home / dotcloud / environment.json')作为f:     env = json.load(f)     #在我们的env全局中制作所有变量的一点点破解     全局()。更新(ENV)


    无论如何,我建议转过来,让设置文件导入这个模块。

    此外,Django默认不监听环境变量(django.conf.settings除外,因此也可能是问题。