Kiw*_*iwi 12 python django environment-variables
在尝试查找存储和保存settings.py和数据库之外的设置的地方时,我使用了environment.json作为环境变量.我在settings.py中导入这些.
我的问题是,当我尝试在我的环境中更改或存储新值时env,settings.py不会注意到更改 - 可能是因为Django读取了settings.py的时间和次数.
有没有办法可以按照我想要的方式使用我的环境变量?
# 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'
Run Code Online (Sandbox Code Playgroud)
如果没有,我还能如何存储settings.py我的Django项目中某处检索到的可更改设置?
ery*_*les 34
您可能想要查看foreman(GitHub)或honcho(GitHub).这两个.env文件都在当前目录中查找要加载本地环境变量的文件.
.env对于大多数项目,我看起来像这样(我使用dj-database-url进行数据库配置):
DATABASE_URL=sqlite://localhost/local.db
SECRET_KEY=<a secret key>
DEBUG=True
Run Code Online (Sandbox Code Playgroud)
在您的settings.py文件中,您可以os.environ像这样加载这些设置:
import os
DEBUG = os.environ.get('DEBUG', False)
Run Code Online (Sandbox Code Playgroud)
如果有必要的设置,您可以assert在尝试设置之前进行设置:
assert 'SECRET_KEY' in os.environ, 'Set SECRET_KEY in your .env file!'
SECRET_KEY = os.environ['SECRET_KEY']
Run Code Online (Sandbox Code Playgroud)
我一直在使用这种方法来处理我已经开始的最后几个项目的本地设置,我认为它的效果非常好.一个警告是永远不会将您.env的源控制权提交给您.这些是仅存在于当前配置的本地设置,应该为不同的环境重新创建.
我看到问题略有改变,原来的答案仍在下面,但这个答案略有不同:
首先,确保使用正确的settings.py(print 'This file is being loaded'应该这样做).
其次,我个人建议不要使用json文件进行配置,因为它不像Python文件那样动态,但它应该可以正常工作.
我建议这样做的方式:
base_settings.py使用标准设置创建文件settings.py将是您的默认设置导入.此文件应from base_settings import *在顶部有一个继承基本设置.dotcloud_settings.py例如,如果要拥有自定义设置文件,只需添加from dotcloud_settings import settings(或base_settings)并将环境变量设置DJANGO_SETTINGS_MODULE为dotcloud_settings或your_project.dotcloud_settings根据您的设置.请注意,从这些设置文件导入Django模块时应该非常小心.如果任何模块执行a from django.conf import settings,它将在该点之后停止解析您的设置.
至于使用json文件,当然大致相同的原则:
django.conf.settings东西将json文件中的所有变量全局设置为您的设置文件:
用open打开json('/ home/dotcloud/environment.json')作为f:env = json.load(f)#在我们的env全局globals()中创建所有变量的一点点修改.update(env)
无论如何,我建议转过来,让设置文件导入这个模块.
此外,Django默认不监听环境变量(除此之外DJANGO_SETTINGS_MODULE可能也是问题).